algebra.big_operators.order
⟷
Mathlib.Algebra.BigOperators.Order
The following section lists changes to this file in mathlib3 and mathlib4 that occured after the initial port. Most recent changes are shown first. Hovering over a commit will show all commits associated with the same mathlib3 commit.
(last sync)
attach
and filter
lemmas (#18087)
Left commutativity and cardinality of list.filter
/multiset.filter
/finset.filter
. Interaction of count
/countp
and attach
.
@@ -174,7 +174,7 @@ lemma prod_le_pow_card (s : finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s,
begin
refine (multiset.prod_le_pow_card (s.val.map f) n _).trans _,
{ simpa using h },
- { simpa }
+ { simp }
end
@[to_additive card_nsmul_le_sum]
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
canonically_ordered_comm_semiring.to_ordered_comm_monoid
(#18504)
Also merge finset.prod_le_prod'
with finset.prod_le_prod''
.
Mathlib 4 version is leanprover-community/mathlib4#2510
@@ -110,7 +110,7 @@ variables {f g : ι → N} {s t : finset ι}
equal to the corresponding factor `g i` of another finite product, then
`∏ i in s, f i ≤ ∏ i in s, g i`. -/
@[to_additive sum_le_sum]
-lemma prod_le_prod'' (h : ∀ i ∈ s, f i ≤ g i) : ∏ i in s, f i ≤ ∏ i in s, g i :=
+lemma prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) : ∏ i in s, f i ≤ ∏ i in s, g i :=
multiset.prod_map_le_prod_map f g h
/-- In an ordered additive commutative monoid, if each summand `f i` of one finite sum is less than
@@ -119,14 +119,14 @@ or equal to the corresponding summand `g i` of another finite sum, then
add_decl_doc sum_le_sum
@[to_additive sum_nonneg] lemma one_le_prod' (h : ∀i ∈ s, 1 ≤ f i) : 1 ≤ (∏ i in s, f i) :=
-le_trans (by rw prod_const_one) (prod_le_prod'' h)
+le_trans (by rw prod_const_one) (prod_le_prod' h)
@[to_additive finset.sum_nonneg']
lemma one_le_prod'' (h : ∀ (i : ι), 1 ≤ f i) : 1 ≤ ∏ (i : ι) in s, f i :=
finset.one_le_prod' (λ i hi, h i)
@[to_additive sum_nonpos] lemma prod_le_one' (h : ∀i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 :=
-(prod_le_prod'' h).trans_eq (by rw prod_const_one)
+(prod_le_prod' h).trans_eq (by rw prod_const_one)
@[to_additive sum_le_sum_of_subset_of_nonneg]
lemma prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉ s → 1 ≤ f i) :
@@ -367,7 +367,7 @@ begin
classical,
rcases Hlt with ⟨i, hi, hlt⟩,
rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)],
- exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod'' $ λ j hj, Hle j $ mem_of_mem_erase hj)
+ exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod' $ λ j hj, Hle j $ mem_of_mem_erase hj)
end
@[to_additive sum_lt_sum_of_nonempty]
@@ -432,7 +432,7 @@ begin
refine finset.induction_on s (λ _, ⟨λ _ _, false.elim, λ _, rfl⟩) (λ a s ha ih H, _),
specialize ih (λ i, H i ∘ finset.mem_insert_of_mem),
rw [finset.prod_insert ha, finset.prod_insert ha, finset.forall_mem_insert, ←ih],
- exact mul_eq_mul_iff_eq_and_eq (H a (s.mem_insert_self a)) (finset.prod_le_prod''
+ exact mul_eq_mul_iff_eq_and_eq (H a (s.mem_insert_self a)) (finset.prod_le_prod'
(λ i, H i ∘ finset.mem_insert_of_mem)),
end
@@ -447,7 +447,7 @@ theorem exists_lt_of_prod_lt' (Hlt : ∏ i in s, f i < ∏ i in s, g i) :
∃ i ∈ s, f i < g i :=
begin
contrapose! Hlt with Hle,
- exact prod_le_prod'' Hle
+ exact prod_le_prod' Hle
end
@[to_additive exists_le_of_sum_le]
@@ -482,7 +482,7 @@ lemma prod_nonneg (h0 : ∀ i ∈ s, 0 ≤ f i) : 0 ≤ ∏ i in s, f i :=
prod_induction f (λ i, 0 ≤ i) (λ _ _ ha hb, mul_nonneg ha hb) zero_le_one h0
/-- If all `f i`, `i ∈ s`, are nonnegative and each `f i` is less than or equal to `g i`, then the
-product of `f i` is less than or equal to the product of `g i`. See also `finset.prod_le_prod''` for
+product of `f i` is less than or equal to the product of `g i`. See also `finset.prod_le_prod'` for
the case of an ordered commutative multiplicative monoid. -/
lemma prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g i) :
∏ i in s, f i ≤ ∏ i in s, g i :=
@@ -551,18 +551,6 @@ lemma _root_.canonically_ordered_comm_semiring.prod_pos [nontrivial R] :
0 < ∏ i in s, f i ↔ (∀ i ∈ s, (0 : R) < f i) :=
canonically_ordered_comm_semiring.multiset_prod_pos.trans $ by simp
-lemma prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) :
- ∏ i in s, f i ≤ ∏ i in s, g i :=
-begin
- classical,
- induction s using finset.induction with a s has ih h,
- { simp },
- { rw [finset.prod_insert has, finset.prod_insert has],
- apply mul_le_mul',
- { exact h _ (finset.mem_insert_self a s) },
- { exact ih (λ i hi, h _ (finset.mem_insert_of_mem hi)) } }
-end
-
/-- If `g, h ≤ f` and `g i + h i ≤ f i`, then the product of `f` over `s` is at least the
sum of the products of `g` and `h`. This is the version for `canonically_ordered_comm_semiring`.
-/
@@ -587,7 +575,7 @@ variables [fintype ι]
@[to_additive sum_mono, mono]
lemma prod_mono' [ordered_comm_monoid M] : monotone (λ f : ι → M, ∏ i, f i) :=
-λ f g hfg, finset.prod_le_prod'' $ λ x _, hfg x
+λ f g hfg, finset.prod_le_prod' $ λ x _, hfg x
attribute [mono] sum_mono
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
with_top
/with_bot
(#18487)
Backport leanprover-community/mathlib4#2406
@@ -602,34 +602,26 @@ namespace with_top
open finset
/-- A product of finite numbers is still finite -/
-lemma prod_lt_top [canonically_ordered_comm_semiring R] [nontrivial R] [decidable_eq R]
- {s : finset ι} {f : ι → with_top R} (h : ∀ i ∈ s, f i ≠ ⊤) :
+lemma prod_lt_top [comm_monoid_with_zero R] [no_zero_divisors R] [nontrivial R] [decidable_eq R]
+ [has_lt R] {s : finset ι} {f : ι → with_top R} (h : ∀ i ∈ s, f i ≠ ⊤) :
∏ i in s, f i < ⊤ :=
-prod_induction f (λ a, a < ⊤) (λ a b h₁ h₂, mul_lt_top h₁.ne h₂.ne) (coe_lt_top 1) $
- λ a ha, lt_top_iff_ne_top.2 (h a ha)
-
-/-- A sum of finite numbers is still finite -/
-lemma sum_lt_top [ordered_add_comm_monoid M] {s : finset ι} {f : ι → with_top M}
- (h : ∀ i ∈ s, f i ≠ ⊤) : (∑ i in s, f i) < ⊤ :=
-sum_induction f (λ a, a < ⊤) (λ a b h₁ h₂, add_lt_top.2 ⟨h₁, h₂⟩) zero_lt_top $
- λ i hi, lt_top_iff_ne_top.2 (h i hi)
+prod_induction f (λ a, a < ⊤) (λ a b h₁ h₂, mul_lt_top' h₁ h₂) (coe_lt_top 1) $
+ λ a ha, with_top.lt_top_iff_ne_top.2 (h a ha)
/-- A sum of numbers is infinite iff one of them is infinite -/
-lemma sum_eq_top_iff [ordered_add_comm_monoid M] {s : finset ι} {f : ι → with_top M} :
+lemma sum_eq_top_iff [add_comm_monoid M] {s : finset ι} {f : ι → with_top M} :
∑ i in s, f i = ⊤ ↔ ∃ i ∈ s, f i = ⊤ :=
-begin
- classical,
- split,
- { contrapose!,
- exact λ h, (sum_lt_top $ λ i hi, (h i hi)).ne },
- { rintro ⟨i, his, hi⟩,
- rw [sum_eq_add_sum_diff_singleton his, hi, top_add] }
-end
+by induction s using finset.cons_induction; simp [*, or_and_distrib_right, exists_or_distrib]
/-- A sum of finite numbers is still finite -/
-lemma sum_lt_top_iff [ordered_add_comm_monoid M] {s : finset ι} {f : ι → with_top M} :
+lemma sum_lt_top_iff [add_comm_monoid M] [has_lt M] {s : finset ι} {f : ι → with_top M} :
∑ i in s, f i < ⊤ ↔ ∀ i ∈ s, f i < ⊤ :=
-by simp only [lt_top_iff_ne_top, ne.def, sum_eq_top_iff, not_exists]
+by simp only [with_top.lt_top_iff_ne_top, ne.def, sum_eq_top_iff, not_exists]
+
+/-- A sum of finite numbers is still finite -/
+lemma sum_lt_top [add_comm_monoid M] [has_lt M] {s : finset ι} {f : ι → with_top M}
+ (h : ∀ i ∈ s, f i ≠ ⊤) : (∑ i in s, f i) < ⊤ :=
+sum_lt_top_iff.2 $ λ i hi, with_top.lt_top_iff_ne_top.2 (h i hi)
end with_top
@@ -640,13 +632,7 @@ variables {S : Type*}
lemma absolute_value.sum_le [semiring R] [ordered_semiring S]
(abv : absolute_value R S) (s : finset ι) (f : ι → R) :
abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) :=
-begin
- letI := classical.dec_eq ι,
- refine finset.induction_on s _ (λ i s hi ih, _),
- { simp },
- { simp only [finset.sum_insert hi],
- exact (abv.add_le _ _).trans (add_le_add le_rfl ih) },
-end
+finset.le_sum_of_subadditive abv (map_zero _) abv.add_le _ _
lemma is_absolute_value.abv_sum [semiring R] [ordered_semiring S] (abv : R → S)
[is_absolute_value abv] (f : ι → R) (s : finset ι) :
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
ennreal
(#18391)
This adds:
canonically_ordered_comm_semiring.list_prod_pos
canonically_ordered_comm_semiring.multiset_prod_pos
canonically_ordered_comm_semiring.prod_pos
which extend the existing canonically_ordered_comm_semiring.mul_pos
. Primarily, these are intended for use on enat
and ennreal
, which don't satisfy the typeclasses required by list.prod_pos
and finset.prod_pos
. At any rate, those statements are weaker.
Forward port in https://github.com/leanprover-community/mathlib4/pull/2120
@@ -536,6 +536,21 @@ section canonically_ordered_comm_semiring
variables [canonically_ordered_comm_semiring R] {f g h : ι → R} {s : finset ι} {i : ι}
+@[simp]
+lemma _root_.canonically_ordered_comm_semiring.multiset_prod_pos [nontrivial R] {m : multiset R} :
+ 0 < m.prod ↔ (∀ x ∈ m, (0 : R) < x) :=
+begin
+ induction m using quotient.induction_on,
+ rw [multiset.quot_mk_to_coe, multiset.coe_prod],
+ exact canonically_ordered_comm_semiring.list_prod_pos,
+end
+
+/-- Note that the name is to match `canonically_ordered_comm_semiring.mul_pos`. -/
+@[simp]
+lemma _root_.canonically_ordered_comm_semiring.prod_pos [nontrivial R] :
+ 0 < ∏ i in s, f i ↔ (∀ i ∈ s, (0 : R) < f i) :=
+canonically_ordered_comm_semiring.multiset_prod_pos.trans $ by simp
+
lemma prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) :
∏ i in s, f i ≤ ∏ i in s, g i :=
begin
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(no changes)
(first ported)
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -252,7 +252,7 @@ theorem card_biUnion_le_card_mul [DecidableEq β] (s : Finset ι) (f : ι → Fi
variable {ι' : Type _} [DecidableEq ι']
-/- ./././Mathport/Syntax/Translate/Basic.lean:641:2: warning: expanding binder collection (y «expr ∉ » t) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:642:2: warning: expanding binder collection (y «expr ∉ » t) -/
#print Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' /-
@[to_additive sum_fiberwise_le_sum_of_sum_fiber_nonneg]
theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
@@ -268,7 +268,7 @@ theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι
#align finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg Finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:641:2: warning: expanding binder collection (y «expr ∉ » t) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:642:2: warning: expanding binder collection (y «expr ∉ » t) -/
#print Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' /-
@[to_additive sum_le_sum_fiberwise_of_sum_fiber_nonpos]
theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -540,7 +540,7 @@ theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i
apply prod_le_prod_of_subset_of_one_le'
· simp [Finset.insert_subset_iff, h, ht]
· intro x hx h'x
- simp only [mem_insert, not_or] at h'x
+ simp only [mem_insert, not_or] at h'x
exact hle x hx h'x.2
#align finset.prod_lt_prod_of_subset' Finset.prod_lt_prod_of_subset'
#align finset.sum_lt_sum_of_subset Finset.sum_lt_sum_of_subset
@@ -734,7 +734,7 @@ theorem CanonicallyOrderedCommSemiring.multiset_prod_pos [Nontrivial R] {m : Mul
0 < m.Prod ↔ ∀ x ∈ m, (0 : R) < x :=
by
induction m using Quotient.inductionOn
- rw [Multiset.quot_mk_to_coe, Multiset.coe_prod]
+ rw [Multiset.quot_mk_to_coe, Multiset.prod_coe]
exact CanonicallyOrderedCommSemiring.list_prod_pos
#align canonically_ordered_comm_semiring.multiset_prod_pos CanonicallyOrderedCommSemiring.multiset_prod_pos
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -162,7 +162,12 @@ theorem prod_le_one' (h : ∀ i ∈ s, f i ≤ 1) : ∏ i in s, f i ≤ 1 :=
#print Finset.prod_le_prod_of_subset_of_one_le' /-
@[to_additive sum_le_sum_of_subset_of_nonneg]
theorem prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉ s → 1 ≤ f i) :
- ∏ i in s, f i ≤ ∏ i in t, f i := by classical
+ ∏ i in s, f i ≤ ∏ i in t, f i := by
+ classical calc
+ ∏ i in s, f i ≤ (∏ i in t \ s, f i) * ∏ i in s, f i :=
+ le_mul_of_one_le_left' <| one_le_prod' <| by simpa only [mem_sdiff, and_imp]
+ _ = ∏ i in t \ s ∪ s, f i := (prod_union sdiff_disjoint).symm
+ _ = ∏ i in t, f i := by rw [sdiff_union_of_subset h]
#align finset.prod_le_prod_of_subset_of_one_le' Finset.prod_le_prod_of_subset_of_one_le'
#align finset.sum_le_sum_of_subset_of_nonneg Finset.sum_le_sum_of_subset_of_nonneg
-/
@@ -187,7 +192,14 @@ theorem prod_le_univ_prod_of_one_le' [Fintype ι] {s : Finset ι} (w : ∀ x, 1
#print Finset.prod_eq_one_iff_of_one_le' /-
@[to_additive sum_eq_zero_iff_of_nonneg]
theorem prod_eq_one_iff_of_one_le' : (∀ i ∈ s, 1 ≤ f i) → (∏ i in s, f i = 1 ↔ ∀ i ∈ s, f i = 1) :=
- by classical
+ by
+ classical
+ apply Finset.induction_on s
+ exact fun _ => ⟨fun _ _ => False.elim, fun _ => rfl⟩
+ intro a s ha ih H
+ have : ∀ i ∈ s, 1 ≤ f i := fun _ => H _ ∘ mem_insert_of_mem
+ rw [prod_insert ha, mul_eq_one_iff' (H _ <| mem_insert_self _ _) (one_le_prod' this),
+ forall_mem_insert, ih this]
#align finset.prod_eq_one_iff_of_one_le' Finset.prod_eq_one_iff_of_one_le'
#align finset.sum_eq_zero_iff_of_nonneg Finset.sum_eq_zero_iff_of_nonneg
-/
@@ -471,7 +483,16 @@ theorem prod_mono_set' (f : ι → M) : Monotone fun s => ∏ x in s, f x := fun
#print Finset.prod_le_prod_of_ne_one' /-
@[to_additive sum_le_sum_of_ne_zero]
theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : ∏ x in s, f x ≤ ∏ x in t, f x := by
- classical
+ classical calc
+ ∏ x in s, f x =
+ (∏ x in s.filter fun x => f x = 1, f x) * ∏ x in s.filter fun x => f x ≠ 1, f x :=
+ by
+ rw [← prod_union, filter_union_filter_neg_eq] <;>
+ exact disjoint_filter.2 fun _ _ h n_h => n_h h
+ _ ≤ ∏ x in t, f x :=
+ mul_le_of_le_one_of_le
+ (prod_le_one' <| by simp only [mem_filter, and_imp] <;> exact fun _ _ => le_of_eq)
+ (prod_le_prod_of_subset' <| by simpa only [subset_iff, mem_filter, and_imp])
#align finset.prod_le_prod_of_ne_one' Finset.prod_le_prod_of_ne_one'
#align finset.sum_le_sum_of_ne_zero Finset.sum_le_sum_of_ne_zero
-/
@@ -485,7 +506,11 @@ variable [OrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
#print Finset.prod_lt_prod' /-
@[to_additive sum_lt_sum]
theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i < g i) :
- ∏ i in s, f i < ∏ i in s, g i := by classical
+ ∏ i in s, f i < ∏ i in s, g i := by
+ classical
+ rcases Hlt with ⟨i, hi, hlt⟩
+ rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
+ exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod' fun j hj => Hle j <| mem_of_mem_erase hj)
#align finset.prod_lt_prod' Finset.prod_lt_prod'
#align finset.sum_lt_sum Finset.sum_lt_sum
-/
@@ -505,7 +530,18 @@ theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g
#print Finset.prod_lt_prod_of_subset' /-
@[to_additive sum_lt_sum_of_subset]
theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i ∉ s) (hlt : 1 < f i)
- (hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : ∏ j in s, f j < ∏ j in t, f j := by classical
+ (hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : ∏ j in s, f j < ∏ j in t, f j := by
+ classical calc
+ ∏ j in s, f j < ∏ j in insert i s, f j :=
+ by
+ rw [prod_insert hs]
+ exact lt_mul_of_one_lt_left' (∏ j in s, f j) hlt
+ _ ≤ ∏ j in t, f j := by
+ apply prod_le_prod_of_subset_of_one_le'
+ · simp [Finset.insert_subset_iff, h, ht]
+ · intro x hx h'x
+ simp only [mem_insert, not_or] at h'x
+ exact hle x hx h'x.2
#align finset.prod_lt_prod_of_subset' Finset.prod_lt_prod_of_subset'
#align finset.sum_lt_sum_of_subset Finset.sum_lt_sum_of_subset
-/
@@ -558,7 +594,16 @@ theorem prod_lt_one' (h : ∀ i ∈ s, f i ≤ 1) (hs : ∃ i ∈ s, f i < 1) :
#print Finset.prod_eq_prod_iff_of_le /-
@[to_additive]
theorem prod_eq_prod_iff_of_le {f g : ι → M} (h : ∀ i ∈ s, f i ≤ g i) :
- ∏ i in s, f i = ∏ i in s, g i ↔ ∀ i ∈ s, f i = g i := by classical
+ ∏ i in s, f i = ∏ i in s, g i ↔ ∀ i ∈ s, f i = g i := by
+ classical
+ revert h
+ refine'
+ Finset.induction_on s (fun _ => ⟨fun _ _ => False.elim, fun _ => rfl⟩) fun a s ha ih H => _
+ specialize ih fun i => H i ∘ Finset.mem_insert_of_mem
+ rw [Finset.prod_insert ha, Finset.prod_insert ha, Finset.forall_mem_insert, ← ih]
+ exact
+ mul_eq_mul_iff_eq_and_eq (H a (s.mem_insert_self a))
+ (Finset.prod_le_prod' fun i => H i ∘ Finset.mem_insert_of_mem)
#align finset.prod_eq_prod_iff_of_le Finset.prod_eq_prod_iff_of_le
#align finset.sum_eq_sum_iff_of_le Finset.sum_eq_sum_iff_of_le
-/
@@ -710,6 +755,14 @@ theorem CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
theorem prod_add_prod_le' (hi : i ∈ s) (h2i : g i + h i ≤ f i) (hgf : ∀ j ∈ s, j ≠ i → g j ≤ f j)
(hhf : ∀ j ∈ s, j ≠ i → h j ≤ f j) : ∏ i in s, g i + ∏ i in s, h i ≤ ∏ i in s, f i := by
classical
+ simp_rw [prod_eq_mul_prod_diff_singleton hi]
+ refine' le_trans _ (mul_le_mul_right' h2i _)
+ rw [right_distrib]
+ apply add_le_add <;> apply mul_le_mul_left' <;> apply prod_le_prod' <;>
+ simp only [and_imp, mem_sdiff, mem_singleton] <;>
+ intros <;>
+ apply_assumption <;>
+ assumption
#align finset.prod_add_prod_le' Finset.prod_add_prod_le'
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -162,12 +162,7 @@ theorem prod_le_one' (h : ∀ i ∈ s, f i ≤ 1) : ∏ i in s, f i ≤ 1 :=
#print Finset.prod_le_prod_of_subset_of_one_le' /-
@[to_additive sum_le_sum_of_subset_of_nonneg]
theorem prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉ s → 1 ≤ f i) :
- ∏ i in s, f i ≤ ∏ i in t, f i := by
- classical calc
- ∏ i in s, f i ≤ (∏ i in t \ s, f i) * ∏ i in s, f i :=
- le_mul_of_one_le_left' <| one_le_prod' <| by simpa only [mem_sdiff, and_imp]
- _ = ∏ i in t \ s ∪ s, f i := (prod_union sdiff_disjoint).symm
- _ = ∏ i in t, f i := by rw [sdiff_union_of_subset h]
+ ∏ i in s, f i ≤ ∏ i in t, f i := by classical
#align finset.prod_le_prod_of_subset_of_one_le' Finset.prod_le_prod_of_subset_of_one_le'
#align finset.sum_le_sum_of_subset_of_nonneg Finset.sum_le_sum_of_subset_of_nonneg
-/
@@ -192,14 +187,7 @@ theorem prod_le_univ_prod_of_one_le' [Fintype ι] {s : Finset ι} (w : ∀ x, 1
#print Finset.prod_eq_one_iff_of_one_le' /-
@[to_additive sum_eq_zero_iff_of_nonneg]
theorem prod_eq_one_iff_of_one_le' : (∀ i ∈ s, 1 ≤ f i) → (∏ i in s, f i = 1 ↔ ∀ i ∈ s, f i = 1) :=
- by
- classical
- apply Finset.induction_on s
- exact fun _ => ⟨fun _ _ => False.elim, fun _ => rfl⟩
- intro a s ha ih H
- have : ∀ i ∈ s, 1 ≤ f i := fun _ => H _ ∘ mem_insert_of_mem
- rw [prod_insert ha, mul_eq_one_iff' (H _ <| mem_insert_self _ _) (one_le_prod' this),
- forall_mem_insert, ih this]
+ by classical
#align finset.prod_eq_one_iff_of_one_le' Finset.prod_eq_one_iff_of_one_le'
#align finset.sum_eq_zero_iff_of_nonneg Finset.sum_eq_zero_iff_of_nonneg
-/
@@ -483,16 +471,7 @@ theorem prod_mono_set' (f : ι → M) : Monotone fun s => ∏ x in s, f x := fun
#print Finset.prod_le_prod_of_ne_one' /-
@[to_additive sum_le_sum_of_ne_zero]
theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : ∏ x in s, f x ≤ ∏ x in t, f x := by
- classical calc
- ∏ x in s, f x =
- (∏ x in s.filter fun x => f x = 1, f x) * ∏ x in s.filter fun x => f x ≠ 1, f x :=
- by
- rw [← prod_union, filter_union_filter_neg_eq] <;>
- exact disjoint_filter.2 fun _ _ h n_h => n_h h
- _ ≤ ∏ x in t, f x :=
- mul_le_of_le_one_of_le
- (prod_le_one' <| by simp only [mem_filter, and_imp] <;> exact fun _ _ => le_of_eq)
- (prod_le_prod_of_subset' <| by simpa only [subset_iff, mem_filter, and_imp])
+ classical
#align finset.prod_le_prod_of_ne_one' Finset.prod_le_prod_of_ne_one'
#align finset.sum_le_sum_of_ne_zero Finset.sum_le_sum_of_ne_zero
-/
@@ -506,11 +485,7 @@ variable [OrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
#print Finset.prod_lt_prod' /-
@[to_additive sum_lt_sum]
theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i < g i) :
- ∏ i in s, f i < ∏ i in s, g i := by
- classical
- rcases Hlt with ⟨i, hi, hlt⟩
- rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
- exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod' fun j hj => Hle j <| mem_of_mem_erase hj)
+ ∏ i in s, f i < ∏ i in s, g i := by classical
#align finset.prod_lt_prod' Finset.prod_lt_prod'
#align finset.sum_lt_sum Finset.sum_lt_sum
-/
@@ -530,18 +505,7 @@ theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g
#print Finset.prod_lt_prod_of_subset' /-
@[to_additive sum_lt_sum_of_subset]
theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i ∉ s) (hlt : 1 < f i)
- (hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : ∏ j in s, f j < ∏ j in t, f j := by
- classical calc
- ∏ j in s, f j < ∏ j in insert i s, f j :=
- by
- rw [prod_insert hs]
- exact lt_mul_of_one_lt_left' (∏ j in s, f j) hlt
- _ ≤ ∏ j in t, f j := by
- apply prod_le_prod_of_subset_of_one_le'
- · simp [Finset.insert_subset_iff, h, ht]
- · intro x hx h'x
- simp only [mem_insert, not_or] at h'x
- exact hle x hx h'x.2
+ (hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : ∏ j in s, f j < ∏ j in t, f j := by classical
#align finset.prod_lt_prod_of_subset' Finset.prod_lt_prod_of_subset'
#align finset.sum_lt_sum_of_subset Finset.sum_lt_sum_of_subset
-/
@@ -594,16 +558,7 @@ theorem prod_lt_one' (h : ∀ i ∈ s, f i ≤ 1) (hs : ∃ i ∈ s, f i < 1) :
#print Finset.prod_eq_prod_iff_of_le /-
@[to_additive]
theorem prod_eq_prod_iff_of_le {f g : ι → M} (h : ∀ i ∈ s, f i ≤ g i) :
- ∏ i in s, f i = ∏ i in s, g i ↔ ∀ i ∈ s, f i = g i := by
- classical
- revert h
- refine'
- Finset.induction_on s (fun _ => ⟨fun _ _ => False.elim, fun _ => rfl⟩) fun a s ha ih H => _
- specialize ih fun i => H i ∘ Finset.mem_insert_of_mem
- rw [Finset.prod_insert ha, Finset.prod_insert ha, Finset.forall_mem_insert, ← ih]
- exact
- mul_eq_mul_iff_eq_and_eq (H a (s.mem_insert_self a))
- (Finset.prod_le_prod' fun i => H i ∘ Finset.mem_insert_of_mem)
+ ∏ i in s, f i = ∏ i in s, g i ↔ ∀ i ∈ s, f i = g i := by classical
#align finset.prod_eq_prod_iff_of_le Finset.prod_eq_prod_iff_of_le
#align finset.sum_eq_sum_iff_of_le Finset.sum_eq_sum_iff_of_le
-/
@@ -755,14 +710,6 @@ theorem CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
theorem prod_add_prod_le' (hi : i ∈ s) (h2i : g i + h i ≤ f i) (hgf : ∀ j ∈ s, j ≠ i → g j ≤ f j)
(hhf : ∀ j ∈ s, j ≠ i → h j ≤ f j) : ∏ i in s, g i + ∏ i in s, h i ≤ ∏ i in s, f i := by
classical
- simp_rw [prod_eq_mul_prod_diff_singleton hi]
- refine' le_trans _ (mul_le_mul_right' h2i _)
- rw [right_distrib]
- apply add_le_add <;> apply mul_le_mul_left' <;> apply prod_le_prod' <;>
- simp only [and_imp, mem_sdiff, mem_singleton] <;>
- intros <;>
- apply_assumption <;>
- assumption
#align finset.prod_add_prod_le' Finset.prod_add_prod_le'
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -209,7 +209,6 @@ theorem prod_eq_one_iff_of_one_le' : (∀ i ∈ s, 1 ≤ f i) → (∏ i in s, f
theorem prod_eq_one_iff_of_le_one' : (∀ i ∈ s, f i ≤ 1) → (∏ i in s, f i = 1 ↔ ∀ i ∈ s, f i = 1) :=
@prod_eq_one_iff_of_one_le' _ Nᵒᵈ _ _ _
#align finset.prod_eq_one_iff_of_le_one' Finset.prod_eq_one_iff_of_le_one'
-#align finset.sum_eq_zero_iff_of_nonneg Finset.sum_eq_zero_iff_of_nonneg
-/
#print Finset.single_le_prod' /-
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -453,9 +453,9 @@ theorem card_le_card_biUnion_add_one {s : Finset ι} {f : ι → Finset α} (hf
end DoubleCounting
-section CanonicallyOrderedCommMonoid
+section CanonicallyOrderedAddCommMonoid
-variable [CanonicallyOrderedCommMonoid M] {f : ι → M} {s t : Finset ι}
+variable [CanonicallyOrderedAddCommMonoid M] {f : ι → M} {s t : Finset ι}
#print Finset.prod_eq_one_iff' /-
@[simp, to_additive sum_eq_zero_iff]
@@ -498,7 +498,7 @@ theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : ∏ x
#align finset.sum_le_sum_of_ne_zero Finset.sum_le_sum_of_ne_zero
-/
-end CanonicallyOrderedCommMonoid
+end CanonicallyOrderedAddCommMonoid
section OrderedCancelCommMonoid
mathlib commit https://github.com/leanprover-community/mathlib/commit/65a1391a0106c9204fe45bc73a039f056558cb83
@@ -8,7 +8,7 @@ import Algebra.Order.Ring.WithTop
import Algebra.BigOperators.Basic
import Data.Fintype.Card
-#align_import algebra.big_operators.order from "leanprover-community/mathlib"@"824f9ae93a4f5174d2ea948e2d75843dd83447bb"
+#align_import algebra.big_operators.order from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
/-!
# Results about big operators with values in an ordered algebraic structure.
@@ -230,7 +230,7 @@ theorem prod_le_pow_card (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s
by
refine' (Multiset.prod_le_pow_card (s.val.map f) n _).trans _
· simpa using h
- · simpa
+ · simp
#align finset.prod_le_pow_card Finset.prod_le_pow_card
#align finset.sum_le_card_nsmul Finset.sum_le_card_nsmul
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -453,9 +453,9 @@ theorem card_le_card_biUnion_add_one {s : Finset ι} {f : ι → Finset α} (hf
end DoubleCounting
-section CanonicallyOrderedMonoid
+section CanonicallyOrderedCommMonoid
-variable [CanonicallyOrderedMonoid M] {f : ι → M} {s t : Finset ι}
+variable [CanonicallyOrderedCommMonoid M] {f : ι → M} {s t : Finset ι}
#print Finset.prod_eq_one_iff' /-
@[simp, to_additive sum_eq_zero_iff]
@@ -498,7 +498,7 @@ theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : ∏ x
#align finset.sum_le_sum_of_ne_zero Finset.sum_le_sum_of_ne_zero
-/
-end CanonicallyOrderedMonoid
+end CanonicallyOrderedCommMonoid
section OrderedCancelCommMonoid
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce64cd319bb6b3e82f31c2d38e79080d377be451
@@ -3,10 +3,10 @@ Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
-/
-import Mathbin.Algebra.Order.AbsoluteValue
-import Mathbin.Algebra.Order.Ring.WithTop
-import Mathbin.Algebra.BigOperators.Basic
-import Mathbin.Data.Fintype.Card
+import Algebra.Order.AbsoluteValue
+import Algebra.Order.Ring.WithTop
+import Algebra.BigOperators.Basic
+import Data.Fintype.Card
#align_import algebra.big_operators.order from "leanprover-community/mathlib"@"824f9ae93a4f5174d2ea948e2d75843dd83447bb"
@@ -253,7 +253,7 @@ theorem card_biUnion_le_card_mul [DecidableEq β] (s : Finset ι) (f : ι → Fi
variable {ι' : Type _} [DecidableEq ι']
-/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (y «expr ∉ » t) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:641:2: warning: expanding binder collection (y «expr ∉ » t) -/
#print Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' /-
@[to_additive sum_fiberwise_le_sum_of_sum_fiber_nonneg]
theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
@@ -269,7 +269,7 @@ theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι
#align finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg Finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (y «expr ∉ » t) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:641:2: warning: expanding binder collection (y «expr ∉ » t) -/
#print Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' /-
@[to_additive sum_le_sum_fiberwise_of_sum_fiber_nonpos]
theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
mathlib commit https://github.com/leanprover-community/mathlib/commit/63721b2c3eba6c325ecf8ae8cca27155a4f6306f
@@ -785,14 +785,14 @@ theorem prod_mono' [OrderedCommMonoid M] : Monotone fun f : ι → M => ∏ i, f
attribute [mono] sum_mono
-#print Fintype.prod_strict_mono' /-
+#print Fintype.prod_strictMono' /-
@[to_additive sum_strict_mono]
-theorem prod_strict_mono' [OrderedCancelCommMonoid M] : StrictMono fun f : ι → M => ∏ x, f x :=
+theorem prod_strictMono' [OrderedCancelCommMonoid M] : StrictMono fun f : ι → M => ∏ x, f x :=
fun f g hfg =>
let ⟨hle, i, hlt⟩ := Pi.lt_def.mp hfg
Finset.prod_lt_prod' (fun i _ => hle i) ⟨i, Finset.mem_univ i, hlt⟩
-#align fintype.prod_strict_mono' Fintype.prod_strict_mono'
-#align fintype.sum_strict_mono Fintype.sum_strict_mono
+#align fintype.prod_strict_mono' Fintype.prod_strictMono'
+#align fintype.sum_strict_mono Fintype.sum_strictMono
-/
end Fintype
mathlib commit https://github.com/leanprover-community/mathlib/commit/8ea5598db6caeddde6cb734aa179cc2408dbd345
@@ -2,17 +2,14 @@
Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
-
-! This file was ported from Lean 3 source module algebra.big_operators.order
-! leanprover-community/mathlib commit 824f9ae93a4f5174d2ea948e2d75843dd83447bb
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathbin.Algebra.Order.AbsoluteValue
import Mathbin.Algebra.Order.Ring.WithTop
import Mathbin.Algebra.BigOperators.Basic
import Mathbin.Data.Fintype.Card
+#align_import algebra.big_operators.order from "leanprover-community/mathlib"@"824f9ae93a4f5174d2ea948e2d75843dd83447bb"
+
/-!
# Results about big operators with values in an ordered algebraic structure.
@@ -256,7 +253,7 @@ theorem card_biUnion_le_card_mul [DecidableEq β] (s : Finset ι) (f : ι → Fi
variable {ι' : Type _} [DecidableEq ι']
-/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (y «expr ∉ » t) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (y «expr ∉ » t) -/
#print Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' /-
@[to_additive sum_fiberwise_le_sum_of_sum_fiber_nonneg]
theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
@@ -272,7 +269,7 @@ theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι
#align finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg Finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg
-/
-/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (y «expr ∉ » t) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (y «expr ∉ » t) -/
#print Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' /-
@[to_additive sum_le_sum_fiberwise_of_sum_fiber_nonpos]
theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
mathlib commit https://github.com/leanprover-community/mathlib/commit/8b981918a93bc45a8600de608cde7944a80d92b9
@@ -542,7 +542,7 @@ theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i
exact lt_mul_of_one_lt_left' (∏ j in s, f j) hlt
_ ≤ ∏ j in t, f j := by
apply prod_le_prod_of_subset_of_one_le'
- · simp [Finset.insert_subset, h, ht]
+ · simp [Finset.insert_subset_iff, h, ht]
· intro x hx h'x
simp only [mem_insert, not_or] at h'x
exact hle x hx h'x.2
mathlib commit https://github.com/leanprover-community/mathlib/commit/9fb8964792b4237dac6200193a0d533f1b3f7423
@@ -36,6 +36,7 @@ section OrderedCommMonoid
variable [CommMonoid M] [OrderedCommMonoid N]
+#print Finset.le_prod_nonempty_of_submultiplicative_on_pred /-
/-- Let `{x | p x}` be a subsemigroup of a commutative monoid `M`. Let `f : M → N` be a map
submultiplicative on `{x | p x}`, i.e., `p x → p y → f (x * y) ≤ f x * f y`. Let `g i`, `i ∈ s`, be
a nonempty finite family of elements of `M` such that `∀ i ∈ s, p (g i)`. Then
@@ -53,6 +54,7 @@ theorem le_prod_nonempty_of_submultiplicative_on_pred (f : M → N) (p : M → P
rfl
#align finset.le_prod_nonempty_of_submultiplicative_on_pred Finset.le_prod_nonempty_of_submultiplicative_on_pred
#align finset.le_sum_nonempty_of_subadditive_on_pred Finset.le_sum_nonempty_of_subadditive_on_pred
+-/
/-- Let `{x | p x}` be an additive subsemigroup of an additive commutative monoid `M`. Let
`f : M → N` be a map subadditive on `{x | p x}`, i.e., `p x → p y → f (x + y) ≤ f x + f y`. Let
@@ -60,6 +62,7 @@ theorem le_prod_nonempty_of_submultiplicative_on_pred (f : M → N) (p : M → P
`f (∑ i in s, g i) ≤ ∑ i in s, f (g i)`. -/
add_decl_doc le_sum_nonempty_of_subadditive_on_pred
+#print Finset.le_prod_nonempty_of_submultiplicative /-
/-- If `f : M → N` is a submultiplicative function, `f (x * y) ≤ f x * f y` and `g i`, `i ∈ s`, is a
nonempty finite family of elements of `M`, then `f (∏ i in s, g i) ≤ ∏ i in s, f (g i)`. -/
@[to_additive le_sum_nonempty_of_subadditive]
@@ -69,11 +72,13 @@ theorem le_prod_nonempty_of_submultiplicative (f : M → N) (h_mul : ∀ x y, f
(fun _ _ _ _ => trivial) g s hs fun _ _ => trivial
#align finset.le_prod_nonempty_of_submultiplicative Finset.le_prod_nonempty_of_submultiplicative
#align finset.le_sum_nonempty_of_subadditive Finset.le_sum_nonempty_of_subadditive
+-/
/-- If `f : M → N` is a subadditive function, `f (x + y) ≤ f x + f y` and `g i`, `i ∈ s`, is a
nonempty finite family of elements of `M`, then `f (∑ i in s, g i) ≤ ∑ i in s, f (g i)`. -/
add_decl_doc le_sum_nonempty_of_subadditive
+#print Finset.le_prod_of_submultiplicative_on_pred /-
/-- Let `{x | p x}` be a subsemigroup of a commutative monoid `M`. Let `f : M → N` be a map
such that `f 1 = 1` and `f` is submultiplicative on `{x | p x}`, i.e.,
`p x → p y → f (x * y) ≤ f x * f y`. Let `g i`, `i ∈ s`, be a finite family of elements of `M` such
@@ -88,6 +93,7 @@ theorem le_prod_of_submultiplicative_on_pred (f : M → N) (p : M → Prop) (h_o
· exact le_prod_nonempty_of_submultiplicative_on_pred f p h_mul hp_mul g s hs_nonempty hs
#align finset.le_prod_of_submultiplicative_on_pred Finset.le_prod_of_submultiplicative_on_pred
#align finset.le_sum_of_subadditive_on_pred Finset.le_sum_of_subadditive_on_pred
+-/
/-- Let `{x | p x}` be a subsemigroup of a commutative additive monoid `M`. Let `f : M → N` be a map
such that `f 0 = 0` and `f` is subadditive on `{x | p x}`, i.e. `p x → p y → f (x + y) ≤ f x + f y`.
@@ -95,6 +101,7 @@ Let `g i`, `i ∈ s`, be a finite family of elements of `M` such that `∀ i ∈
`f (∑ x in s, g x) ≤ ∑ x in s, f (g x)`. -/
add_decl_doc le_sum_of_subadditive_on_pred
+#print Finset.le_prod_of_submultiplicative /-
/-- If `f : M → N` is a submultiplicative function, `f (x * y) ≤ f x * f y`, `f 1 = 1`, and `g i`,
`i ∈ s`, is a finite family of elements of `M`, then `f (∏ i in s, g i) ≤ ∏ i in s, f (g i)`. -/
@[to_additive le_sum_of_subadditive]
@@ -107,6 +114,7 @@ theorem le_prod_of_submultiplicative (f : M → N) (h_one : f 1 = 1)
rfl
#align finset.le_prod_of_submultiplicative Finset.le_prod_of_submultiplicative
#align finset.le_sum_of_subadditive Finset.le_sum_of_subadditive
+-/
/-- If `f : M → N` is a subadditive function, `f (x + y) ≤ f x + f y`, `f 0 = 0`, and `g i`,
`i ∈ s`, is a finite family of elements of `M`, then `f (∑ i in s, g i) ≤ ∑ i in s, f (g i)`. -/
@@ -114,6 +122,7 @@ add_decl_doc le_sum_of_subadditive
variable {f g : ι → N} {s t : Finset ι}
+#print Finset.prod_le_prod' /-
/-- In an ordered commutative monoid, if each factor `f i` of one finite product is less than or
equal to the corresponding factor `g i` of another finite product, then
`∏ i in s, f i ≤ ∏ i in s, g i`. -/
@@ -122,30 +131,38 @@ theorem prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) : ∏ i in s, f i ≤ ∏ i
Multiset.prod_map_le_prod_map f g h
#align finset.prod_le_prod' Finset.prod_le_prod'
#align finset.sum_le_sum Finset.sum_le_sum
+-/
/-- In an ordered additive commutative monoid, if each summand `f i` of one finite sum is less than
or equal to the corresponding summand `g i` of another finite sum, then
`∑ i in s, f i ≤ ∑ i in s, g i`. -/
add_decl_doc sum_le_sum
+#print Finset.one_le_prod' /-
@[to_additive sum_nonneg]
theorem one_le_prod' (h : ∀ i ∈ s, 1 ≤ f i) : 1 ≤ ∏ i in s, f i :=
le_trans (by rw [prod_const_one]) (prod_le_prod' h)
#align finset.one_le_prod' Finset.one_le_prod'
#align finset.sum_nonneg Finset.sum_nonneg
+-/
+#print Finset.one_le_prod'' /-
@[to_additive Finset.sum_nonneg']
theorem one_le_prod'' (h : ∀ i : ι, 1 ≤ f i) : 1 ≤ ∏ i : ι in s, f i :=
Finset.one_le_prod' fun i hi => h i
#align finset.one_le_prod'' Finset.one_le_prod''
#align finset.sum_nonneg' Finset.sum_nonneg'
+-/
+#print Finset.prod_le_one' /-
@[to_additive sum_nonpos]
theorem prod_le_one' (h : ∀ i ∈ s, f i ≤ 1) : ∏ i in s, f i ≤ 1 :=
(prod_le_prod' h).trans_eq (by rw [prod_const_one])
#align finset.prod_le_one' Finset.prod_le_one'
#align finset.sum_nonpos Finset.sum_nonpos
+-/
+#print Finset.prod_le_prod_of_subset_of_one_le' /-
@[to_additive sum_le_sum_of_subset_of_nonneg]
theorem prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉ s → 1 ≤ f i) :
∏ i in s, f i ≤ ∏ i in t, f i := by
@@ -156,20 +173,26 @@ theorem prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉
_ = ∏ i in t, f i := by rw [sdiff_union_of_subset h]
#align finset.prod_le_prod_of_subset_of_one_le' Finset.prod_le_prod_of_subset_of_one_le'
#align finset.sum_le_sum_of_subset_of_nonneg Finset.sum_le_sum_of_subset_of_nonneg
+-/
+#print Finset.prod_mono_set_of_one_le' /-
@[to_additive sum_mono_set_of_nonneg]
theorem prod_mono_set_of_one_le' (hf : ∀ x, 1 ≤ f x) : Monotone fun s => ∏ x in s, f x :=
fun s t hst => prod_le_prod_of_subset_of_one_le' hst fun x _ _ => hf x
#align finset.prod_mono_set_of_one_le' Finset.prod_mono_set_of_one_le'
#align finset.sum_mono_set_of_nonneg Finset.sum_mono_set_of_nonneg
+-/
+#print Finset.prod_le_univ_prod_of_one_le' /-
@[to_additive sum_le_univ_sum_of_nonneg]
theorem prod_le_univ_prod_of_one_le' [Fintype ι] {s : Finset ι} (w : ∀ x, 1 ≤ f x) :
∏ x in s, f x ≤ ∏ x, f x :=
prod_le_prod_of_subset_of_one_le' (subset_univ s) fun a _ _ => w a
#align finset.prod_le_univ_prod_of_one_le' Finset.prod_le_univ_prod_of_one_le'
#align finset.sum_le_univ_sum_of_nonneg Finset.sum_le_univ_sum_of_nonneg
+-/
+#print Finset.prod_eq_one_iff_of_one_le' /-
@[to_additive sum_eq_zero_iff_of_nonneg]
theorem prod_eq_one_iff_of_one_le' : (∀ i ∈ s, 1 ≤ f i) → (∏ i in s, f i = 1 ↔ ∀ i ∈ s, f i = 1) :=
by
@@ -182,13 +205,17 @@ theorem prod_eq_one_iff_of_one_le' : (∀ i ∈ s, 1 ≤ f i) → (∏ i in s, f
forall_mem_insert, ih this]
#align finset.prod_eq_one_iff_of_one_le' Finset.prod_eq_one_iff_of_one_le'
#align finset.sum_eq_zero_iff_of_nonneg Finset.sum_eq_zero_iff_of_nonneg
+-/
+#print Finset.prod_eq_one_iff_of_le_one' /-
@[to_additive sum_eq_zero_iff_of_nonneg]
theorem prod_eq_one_iff_of_le_one' : (∀ i ∈ s, f i ≤ 1) → (∏ i in s, f i = 1 ↔ ∀ i ∈ s, f i = 1) :=
@prod_eq_one_iff_of_one_le' _ Nᵒᵈ _ _ _
#align finset.prod_eq_one_iff_of_le_one' Finset.prod_eq_one_iff_of_le_one'
#align finset.sum_eq_zero_iff_of_nonneg Finset.sum_eq_zero_iff_of_nonneg
+-/
+#print Finset.single_le_prod' /-
@[to_additive single_le_sum]
theorem single_le_prod' (hf : ∀ i ∈ s, 1 ≤ f i) {a} (h : a ∈ s) : f a ≤ ∏ x in s, f x :=
calc
@@ -197,7 +224,9 @@ theorem single_le_prod' (hf : ∀ i ∈ s, 1 ≤ f i) {a} (h : a ∈ s) : f a
prod_le_prod_of_subset_of_one_le' (singleton_subset_iff.2 h) fun i hi _ => hf i hi
#align finset.single_le_prod' Finset.single_le_prod'
#align finset.single_le_sum Finset.single_le_sum
+-/
+#print Finset.prod_le_pow_card /-
@[to_additive sum_le_card_nsmul]
theorem prod_le_pow_card (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s, f x ≤ n) :
s.Prod f ≤ n ^ s.card :=
@@ -207,13 +236,16 @@ theorem prod_le_pow_card (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s
· simpa
#align finset.prod_le_pow_card Finset.prod_le_pow_card
#align finset.sum_le_card_nsmul Finset.sum_le_card_nsmul
+-/
+#print Finset.pow_card_le_prod /-
@[to_additive card_nsmul_le_sum]
theorem pow_card_le_prod (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s, n ≤ f x) :
n ^ s.card ≤ s.Prod f :=
@Finset.prod_le_pow_card _ Nᵒᵈ _ _ _ _ h
#align finset.pow_card_le_prod Finset.pow_card_le_prod
#align finset.card_nsmul_le_sum Finset.card_nsmul_le_sum
+-/
#print Finset.card_biUnion_le_card_mul /-
theorem card_biUnion_le_card_mul [DecidableEq β] (s : Finset ι) (f : ι → Finset β) (n : ℕ)
@@ -225,6 +257,7 @@ theorem card_biUnion_le_card_mul [DecidableEq β] (s : Finset ι) (f : ι → Fi
variable {ι' : Type _} [DecidableEq ι']
/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (y «expr ∉ » t) -/
+#print Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' /-
@[to_additive sum_fiberwise_le_sum_of_sum_fiber_nonneg]
theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
(h : ∀ (y) (_ : y ∉ t), (1 : N) ≤ ∏ x in s.filterₓ fun x => g x = y, f x) :
@@ -237,8 +270,10 @@ theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι
prod_fiberwise_of_maps_to (fun x hx => mem_union.2 <| Or.inr <| mem_image_of_mem _ hx) _
#align finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber'
#align finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg Finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg
+-/
/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (y «expr ∉ » t) -/
+#print Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' /-
@[to_additive sum_le_sum_fiberwise_of_sum_fiber_nonpos]
theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
(h : ∀ (y) (_ : y ∉ t), ∏ x in s.filterₓ fun x => g x = y, f x ≤ 1) :
@@ -246,33 +281,43 @@ theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι
@prod_fiberwise_le_prod_of_one_le_prod_fiber' _ Nᵒᵈ _ _ _ _ _ _ _ h
#align finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one'
#align finset.sum_le_sum_fiberwise_of_sum_fiber_nonpos Finset.sum_le_sum_fiberwise_of_sum_fiber_nonpos
+-/
end OrderedCommMonoid
+#print Finset.abs_sum_le_sum_abs /-
theorem abs_sum_le_sum_abs {G : Type _} [LinearOrderedAddCommGroup G] (f : ι → G) (s : Finset ι) :
|∑ i in s, f i| ≤ ∑ i in s, |f i| :=
le_sum_of_subadditive _ abs_zero abs_add s f
#align finset.abs_sum_le_sum_abs Finset.abs_sum_le_sum_abs
+-/
+#print Finset.abs_sum_of_nonneg /-
theorem abs_sum_of_nonneg {G : Type _} [LinearOrderedAddCommGroup G] {f : ι → G} {s : Finset ι}
(hf : ∀ i ∈ s, 0 ≤ f i) : |∑ i : ι in s, f i| = ∑ i : ι in s, f i := by
rw [abs_of_nonneg (Finset.sum_nonneg hf)]
#align finset.abs_sum_of_nonneg Finset.abs_sum_of_nonneg
+-/
+#print Finset.abs_sum_of_nonneg' /-
theorem abs_sum_of_nonneg' {G : Type _} [LinearOrderedAddCommGroup G] {f : ι → G} {s : Finset ι}
(hf : ∀ i, 0 ≤ f i) : |∑ i : ι in s, f i| = ∑ i : ι in s, f i := by
rw [abs_of_nonneg (Finset.sum_nonneg' hf)]
#align finset.abs_sum_of_nonneg' Finset.abs_sum_of_nonneg'
+-/
+#print Finset.abs_prod /-
theorem abs_prod {R : Type _} [LinearOrderedCommRing R] {f : ι → R} {s : Finset ι} :
|∏ x in s, f x| = ∏ x in s, |f x| :=
(absHom.toMonoidHom : R →* R).map_prod _ _
#align finset.abs_prod Finset.abs_prod
+-/
section Pigeonhole
variable [DecidableEq β]
+#print Finset.card_le_mul_card_image_of_maps_to /-
theorem card_le_mul_card_image_of_maps_to {f : α → β} {s : Finset α} {t : Finset β}
(Hf : ∀ a ∈ s, f a ∈ t) (n : ℕ) (hn : ∀ a ∈ t, (s.filterₓ fun x => f x = a).card ≤ n) :
s.card ≤ n * t.card :=
@@ -281,12 +326,16 @@ theorem card_le_mul_card_image_of_maps_to {f : α → β} {s : Finset α} {t : F
_ ≤ ∑ _ in t, n := (sum_le_sum hn)
_ = _ := by simp [mul_comm]
#align finset.card_le_mul_card_image_of_maps_to Finset.card_le_mul_card_image_of_maps_to
+-/
+#print Finset.card_le_mul_card_image /-
theorem card_le_mul_card_image {f : α → β} (s : Finset α) (n : ℕ)
(hn : ∀ a ∈ s.image f, (s.filterₓ fun x => f x = a).card ≤ n) : s.card ≤ n * (s.image f).card :=
card_le_mul_card_image_of_maps_to (fun x => mem_image_of_mem _) n hn
#align finset.card_le_mul_card_image Finset.card_le_mul_card_image
+-/
+#print Finset.mul_card_image_le_card_of_maps_to /-
theorem mul_card_image_le_card_of_maps_to {f : α → β} {s : Finset α} {t : Finset β}
(Hf : ∀ a ∈ s, f a ∈ t) (n : ℕ) (hn : ∀ a ∈ t, n ≤ (s.filterₓ fun x => f x = a).card) :
n * t.card ≤ s.card :=
@@ -295,11 +344,14 @@ theorem mul_card_image_le_card_of_maps_to {f : α → β} {s : Finset α} {t : F
_ ≤ ∑ a in t, (s.filterₓ fun x => f x = a).card := (sum_le_sum hn)
_ = s.card := by rw [← card_eq_sum_card_fiberwise Hf]
#align finset.mul_card_image_le_card_of_maps_to Finset.mul_card_image_le_card_of_maps_to
+-/
+#print Finset.mul_card_image_le_card /-
theorem mul_card_image_le_card {f : α → β} (s : Finset α) (n : ℕ)
(hn : ∀ a ∈ s.image f, n ≤ (s.filterₓ fun x => f x = a).card) : n * (s.image f).card ≤ s.card :=
mul_card_image_le_card_of_maps_to (fun x => mem_image_of_mem _) n hn
#align finset.mul_card_image_le_card Finset.mul_card_image_le_card
+-/
end Pigeonhole
@@ -371,11 +423,14 @@ theorem sum_card [Fintype α] (h : ∀ a, (B.filterₓ <| (· ∈ ·) a).card =
#align finset.sum_card Finset.sum_card
-/
+#print Finset.card_le_card_biUnion /-
theorem card_le_card_biUnion {s : Finset ι} {f : ι → Finset α} (hs : (s : Set ι).PairwiseDisjoint f)
(hf : ∀ i ∈ s, (f i).Nonempty) : s.card ≤ (s.biUnion f).card := by
rw [card_bUnion hs, card_eq_sum_ones]; exact sum_le_sum fun i hi => (hf i hi).card_pos
#align finset.card_le_card_bUnion Finset.card_le_card_biUnion
+-/
+#print Finset.card_le_card_biUnion_add_card_fiber /-
theorem card_le_card_biUnion_add_card_fiber {s : Finset ι} {f : ι → Finset α}
(hs : (s : Set ι).PairwiseDisjoint f) :
s.card ≤ (s.biUnion f).card + (s.filterₓ fun i => f i = ∅).card :=
@@ -388,13 +443,16 @@ theorem card_le_card_biUnion_add_card_fiber {s : Finset ι} {f : ι → Finset
card_le_of_subset <| bUnion_subset_bUnion_of_subset_left _ <| filter_subset _ _)
_
#align finset.card_le_card_bUnion_add_card_fiber Finset.card_le_card_biUnion_add_card_fiber
+-/
+#print Finset.card_le_card_biUnion_add_one /-
theorem card_le_card_biUnion_add_one {s : Finset ι} {f : ι → Finset α} (hf : Injective f)
(hs : (s : Set ι).PairwiseDisjoint f) : s.card ≤ (s.biUnion f).card + 1 :=
(card_le_card_biUnion_add_card_fiber hs).trans <|
add_le_add_left
(card_le_one.2 fun i hi j hj => hf <| (mem_filter.1 hi).2.trans (mem_filter.1 hj).2.symm) _
#align finset.card_le_card_bUnion_add_one Finset.card_le_card_biUnion_add_one
+-/
end DoubleCounting
@@ -402,24 +460,31 @@ section CanonicallyOrderedMonoid
variable [CanonicallyOrderedMonoid M] {f : ι → M} {s t : Finset ι}
+#print Finset.prod_eq_one_iff' /-
@[simp, to_additive sum_eq_zero_iff]
theorem prod_eq_one_iff' : ∏ x in s, f x = 1 ↔ ∀ x ∈ s, f x = 1 :=
prod_eq_one_iff_of_one_le' fun x hx => one_le (f x)
#align finset.prod_eq_one_iff' Finset.prod_eq_one_iff'
#align finset.sum_eq_zero_iff Finset.sum_eq_zero_iff
+-/
+#print Finset.prod_le_prod_of_subset' /-
@[to_additive sum_le_sum_of_subset]
theorem prod_le_prod_of_subset' (h : s ⊆ t) : ∏ x in s, f x ≤ ∏ x in t, f x :=
prod_le_prod_of_subset_of_one_le' h fun x h₁ h₂ => one_le _
#align finset.prod_le_prod_of_subset' Finset.prod_le_prod_of_subset'
#align finset.sum_le_sum_of_subset Finset.sum_le_sum_of_subset
+-/
+#print Finset.prod_mono_set' /-
@[to_additive sum_mono_set]
theorem prod_mono_set' (f : ι → M) : Monotone fun s => ∏ x in s, f x := fun s₁ s₂ hs =>
prod_le_prod_of_subset' hs
#align finset.prod_mono_set' Finset.prod_mono_set'
#align finset.sum_mono_set Finset.sum_mono_set
+-/
+#print Finset.prod_le_prod_of_ne_one' /-
@[to_additive sum_le_sum_of_ne_zero]
theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : ∏ x in s, f x ≤ ∏ x in t, f x := by
classical calc
@@ -434,6 +499,7 @@ theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : ∏ x
(prod_le_prod_of_subset' <| by simpa only [subset_iff, mem_filter, and_imp])
#align finset.prod_le_prod_of_ne_one' Finset.prod_le_prod_of_ne_one'
#align finset.sum_le_sum_of_ne_zero Finset.sum_le_sum_of_ne_zero
+-/
end CanonicallyOrderedMonoid
@@ -441,6 +507,7 @@ section OrderedCancelCommMonoid
variable [OrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
+#print Finset.prod_lt_prod' /-
@[to_additive sum_lt_sum]
theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i < g i) :
∏ i in s, f i < ∏ i in s, g i := by
@@ -450,7 +517,9 @@ theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i <
exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod' fun j hj => Hle j <| mem_of_mem_erase hj)
#align finset.prod_lt_prod' Finset.prod_lt_prod'
#align finset.sum_lt_sum Finset.sum_lt_sum
+-/
+#print Finset.prod_lt_prod_of_nonempty' /-
@[to_additive sum_lt_sum_of_nonempty]
theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g i) :
∏ i in s, f i < ∏ i in s, g i := by
@@ -460,7 +529,9 @@ theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g
exact ⟨i, hi, Hlt i hi⟩
#align finset.prod_lt_prod_of_nonempty' Finset.prod_lt_prod_of_nonempty'
#align finset.sum_lt_sum_of_nonempty Finset.sum_lt_sum_of_nonempty
+-/
+#print Finset.prod_lt_prod_of_subset' /-
@[to_additive sum_lt_sum_of_subset]
theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i ∉ s) (hlt : 1 < f i)
(hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : ∏ j in s, f j < ∏ j in t, f j := by
@@ -477,7 +548,9 @@ theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i
exact hle x hx h'x.2
#align finset.prod_lt_prod_of_subset' Finset.prod_lt_prod_of_subset'
#align finset.sum_lt_sum_of_subset Finset.sum_lt_sum_of_subset
+-/
+#print Finset.single_lt_prod' /-
@[to_additive single_lt_sum]
theorem single_lt_prod' {i j : ι} (hij : j ≠ i) (hi : i ∈ s) (hj : j ∈ s) (hlt : 1 < f j)
(hle : ∀ k ∈ s, k ≠ i → 1 ≤ f k) : f i < ∏ k in s, f k :=
@@ -488,31 +561,41 @@ theorem single_lt_prod' {i j : ι} (hij : j ≠ i) (hi : i ∈ s) (hj : j ∈ s)
fun k hks hki => hle k hks (mt mem_singleton.2 hki)
#align finset.single_lt_prod' Finset.single_lt_prod'
#align finset.single_lt_sum Finset.single_lt_sum
+-/
+#print Finset.one_lt_prod /-
@[to_additive sum_pos]
theorem one_lt_prod (h : ∀ i ∈ s, 1 < f i) (hs : s.Nonempty) : 1 < ∏ i in s, f i :=
lt_of_le_of_lt (by rw [prod_const_one]) <| prod_lt_prod_of_nonempty' hs h
#align finset.one_lt_prod Finset.one_lt_prod
#align finset.sum_pos Finset.sum_pos
+-/
+#print Finset.prod_lt_one /-
@[to_additive]
theorem prod_lt_one (h : ∀ i ∈ s, f i < 1) (hs : s.Nonempty) : ∏ i in s, f i < 1 :=
(prod_lt_prod_of_nonempty' hs h).trans_le (by rw [prod_const_one])
#align finset.prod_lt_one Finset.prod_lt_one
#align finset.sum_neg Finset.sum_neg
+-/
+#print Finset.one_lt_prod' /-
@[to_additive sum_pos']
theorem one_lt_prod' (h : ∀ i ∈ s, 1 ≤ f i) (hs : ∃ i ∈ s, 1 < f i) : 1 < ∏ i in s, f i :=
prod_const_one.symm.trans_lt <| prod_lt_prod' h hs
#align finset.one_lt_prod' Finset.one_lt_prod'
#align finset.sum_pos' Finset.sum_pos'
+-/
+#print Finset.prod_lt_one' /-
@[to_additive]
theorem prod_lt_one' (h : ∀ i ∈ s, f i ≤ 1) (hs : ∃ i ∈ s, f i < 1) : ∏ i in s, f i < 1 :=
prod_const_one.le.trans_lt' <| prod_lt_prod' h hs
#align finset.prod_lt_one' Finset.prod_lt_one'
#align finset.sum_neg' Finset.sum_neg'
+-/
+#print Finset.prod_eq_prod_iff_of_le /-
@[to_additive]
theorem prod_eq_prod_iff_of_le {f g : ι → M} (h : ∀ i ∈ s, f i ≤ g i) :
∏ i in s, f i = ∏ i in s, g i ↔ ∀ i ∈ s, f i = g i := by
@@ -527,6 +610,7 @@ theorem prod_eq_prod_iff_of_le {f g : ι → M} (h : ∀ i ∈ s, f i ≤ g i) :
(Finset.prod_le_prod' fun i => H i ∘ Finset.mem_insert_of_mem)
#align finset.prod_eq_prod_iff_of_le Finset.prod_eq_prod_iff_of_le
#align finset.sum_eq_sum_iff_of_le Finset.sum_eq_sum_iff_of_le
+-/
end OrderedCancelCommMonoid
@@ -534,6 +618,7 @@ section LinearOrderedCancelCommMonoid
variable [LinearOrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
+#print Finset.exists_lt_of_prod_lt' /-
@[to_additive exists_lt_of_sum_lt]
theorem exists_lt_of_prod_lt' (Hlt : ∏ i in s, f i < ∏ i in s, g i) : ∃ i ∈ s, f i < g i :=
by
@@ -541,7 +626,9 @@ theorem exists_lt_of_prod_lt' (Hlt : ∏ i in s, f i < ∏ i in s, g i) : ∃ i
exact prod_le_prod' Hle
#align finset.exists_lt_of_prod_lt' Finset.exists_lt_of_prod_lt'
#align finset.exists_lt_of_sum_lt Finset.exists_lt_of_sum_lt
+-/
+#print Finset.exists_le_of_prod_le' /-
@[to_additive exists_le_of_sum_le]
theorem exists_le_of_prod_le' (hs : s.Nonempty) (Hle : ∏ i in s, f i ≤ ∏ i in s, g i) :
∃ i ∈ s, f i ≤ g i := by
@@ -549,7 +636,9 @@ theorem exists_le_of_prod_le' (hs : s.Nonempty) (Hle : ∏ i in s, f i ≤ ∏ i
exact prod_lt_prod_of_nonempty' hs Hlt
#align finset.exists_le_of_prod_le' Finset.exists_le_of_prod_le'
#align finset.exists_le_of_sum_le Finset.exists_le_of_sum_le
+-/
+#print Finset.exists_one_lt_of_prod_one_of_exists_ne_one' /-
@[to_additive exists_pos_of_sum_zero_of_exists_nonzero]
theorem exists_one_lt_of_prod_one_of_exists_ne_one' (f : ι → M) (h₁ : ∏ i in s, f i = 1)
(h₂ : ∃ i ∈ s, f i ≠ 1) : ∃ i ∈ s, 1 < f i :=
@@ -562,6 +651,7 @@ theorem exists_one_lt_of_prod_one_of_exists_ne_one' (f : ι → M) (h₁ : ∏ i
_ = 1 := prod_const_one
#align finset.exists_one_lt_of_prod_one_of_exists_ne_one' Finset.exists_one_lt_of_prod_one_of_exists_ne_one'
#align finset.exists_pos_of_sum_zero_of_exists_nonzero Finset.exists_pos_of_sum_zero_of_exists_nonzero
+-/
end LinearOrderedCancelCommMonoid
@@ -571,11 +661,14 @@ variable [OrderedCommSemiring R] {f g : ι → R} {s t : Finset ι}
open scoped Classical
+#print Finset.prod_nonneg /-
-- this is also true for a ordered commutative multiplicative monoid with zero
theorem prod_nonneg (h0 : ∀ i ∈ s, 0 ≤ f i) : 0 ≤ ∏ i in s, f i :=
prod_induction f (fun i => 0 ≤ i) (fun _ _ ha hb => mul_nonneg ha hb) zero_le_one h0
#align finset.prod_nonneg Finset.prod_nonneg
+-/
+#print Finset.prod_le_prod /-
/-- If all `f i`, `i ∈ s`, are nonnegative and each `f i` is less than or equal to `g i`, then the
product of `f i` is less than or equal to the product of `g i`. See also `finset.prod_le_prod'` for
the case of an ordered commutative multiplicative monoid. -/
@@ -590,7 +683,9 @@ theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g
· apply prod_nonneg fun x H => h0 x (mem_insert_of_mem H)
· apply le_trans (h0 a (mem_insert_self a s)) (h1 a (mem_insert_self a s))
#align finset.prod_le_prod Finset.prod_le_prod
+-/
+#print Finset.prod_le_one /-
/-- If each `f i`, `i ∈ s` belongs to `[0, 1]`, then their product is less than or equal to one.
See also `finset.prod_le_one'` for the case of an ordered commutative multiplicative monoid. -/
theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1) : ∏ i in s, f i ≤ 1 :=
@@ -598,7 +693,9 @@ theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1)
convert ← prod_le_prod h0 h1
exact Finset.prod_const_one
#align finset.prod_le_one Finset.prod_le_one
+-/
+#print Finset.prod_add_prod_le /-
/-- If `g, h ≤ f` and `g i + h i ≤ f i`, then the product of `f` over `s` is at least the
sum of the products of `g` and `h`. This is the version for `ordered_comm_semiring`. -/
theorem prod_add_prod_le {i : ι} {f g h : ι → R} (hi : i ∈ s) (h2i : g i + h i ≤ f i)
@@ -614,6 +711,7 @@ theorem prod_add_prod_le {i : ι} {f g h : ι → R} (hi : i ∈ s) (h2i : g i +
· apply prod_nonneg; simp only [and_imp, mem_sdiff, mem_singleton]
intro j h1j h2j; exact le_trans (hg j h1j) (hgf j h1j h2j)
#align finset.prod_add_prod_le Finset.prod_add_prod_le
+-/
end OrderedCommSemiring
@@ -621,10 +719,12 @@ section StrictOrderedCommSemiring
variable [StrictOrderedCommSemiring R] [Nontrivial R] {f : ι → R} {s : Finset ι}
+#print Finset.prod_pos /-
-- This is also true for a ordered commutative multiplicative monoid with zero
theorem prod_pos (h0 : ∀ i ∈ s, 0 < f i) : 0 < ∏ i in s, f i :=
prod_induction f (fun x => 0 < x) (fun _ _ ha hb => mul_pos ha hb) zero_lt_one h0
#align finset.prod_pos Finset.prod_pos
+-/
end StrictOrderedCommSemiring
@@ -632,6 +732,7 @@ section CanonicallyOrderedCommSemiring
variable [CanonicallyOrderedCommSemiring R] {f g h : ι → R} {s : Finset ι} {i : ι}
+#print CanonicallyOrderedCommSemiring.multiset_prod_pos /-
@[simp]
theorem CanonicallyOrderedCommSemiring.multiset_prod_pos [Nontrivial R] {m : Multiset R} :
0 < m.Prod ↔ ∀ x ∈ m, (0 : R) < x :=
@@ -640,14 +741,18 @@ theorem CanonicallyOrderedCommSemiring.multiset_prod_pos [Nontrivial R] {m : Mul
rw [Multiset.quot_mk_to_coe, Multiset.coe_prod]
exact CanonicallyOrderedCommSemiring.list_prod_pos
#align canonically_ordered_comm_semiring.multiset_prod_pos CanonicallyOrderedCommSemiring.multiset_prod_pos
+-/
+#print CanonicallyOrderedCommSemiring.prod_pos /-
/-- Note that the name is to match `canonically_ordered_comm_semiring.mul_pos`. -/
@[simp]
theorem CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
0 < ∏ i in s, f i ↔ ∀ i ∈ s, (0 : R) < f i :=
CanonicallyOrderedCommSemiring.multiset_prod_pos.trans <| by simp
#align canonically_ordered_comm_semiring.prod_pos CanonicallyOrderedCommSemiring.prod_pos
+-/
+#print Finset.prod_add_prod_le' /-
/-- If `g, h ≤ f` and `g i + h i ≤ f i`, then the product of `f` over `s` is at least the
sum of the products of `g` and `h`. This is the version for `canonically_ordered_comm_semiring`.
-/
@@ -663,6 +768,7 @@ theorem prod_add_prod_le' (hi : i ∈ s) (h2i : g i + h i ≤ f i) (hgf : ∀ j
apply_assumption <;>
assumption
#align finset.prod_add_prod_le' Finset.prod_add_prod_le'
+-/
end CanonicallyOrderedCommSemiring
@@ -698,30 +804,38 @@ namespace WithTop
open Finset
+#print WithTop.prod_lt_top /-
/-- A product of finite numbers is still finite -/
theorem prod_lt_top [CommMonoidWithZero R] [NoZeroDivisors R] [Nontrivial R] [DecidableEq R] [LT R]
{s : Finset ι} {f : ι → WithTop R} (h : ∀ i ∈ s, f i ≠ ⊤) : ∏ i in s, f i < ⊤ :=
prod_induction f (fun a => a < ⊤) (fun a b h₁ h₂ => mul_lt_top' h₁ h₂) (coe_lt_top 1) fun a ha =>
WithTop.lt_top_iff_ne_top.2 (h a ha)
#align with_top.prod_lt_top WithTop.prod_lt_top
+-/
+#print WithTop.sum_eq_top_iff /-
/-- A sum of numbers is infinite iff one of them is infinite -/
theorem sum_eq_top_iff [AddCommMonoid M] {s : Finset ι} {f : ι → WithTop M} :
∑ i in s, f i = ⊤ ↔ ∃ i ∈ s, f i = ⊤ := by
induction s using Finset.cons_induction <;> simp [*, or_and_right, exists_or]
#align with_top.sum_eq_top_iff WithTop.sum_eq_top_iff
+-/
+#print WithTop.sum_lt_top_iff /-
/-- A sum of finite numbers is still finite -/
theorem sum_lt_top_iff [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M} :
∑ i in s, f i < ⊤ ↔ ∀ i ∈ s, f i < ⊤ := by
simp only [WithTop.lt_top_iff_ne_top, Ne.def, sum_eq_top_iff, not_exists]
#align with_top.sum_lt_top_iff WithTop.sum_lt_top_iff
+-/
+#print WithTop.sum_lt_top /-
/-- A sum of finite numbers is still finite -/
theorem sum_lt_top [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M}
(h : ∀ i ∈ s, f i ≠ ⊤) : ∑ i in s, f i < ⊤ :=
sum_lt_top_iff.2 fun i hi => WithTop.lt_top_iff_ne_top.2 (h i hi)
#align with_top.sum_lt_top WithTop.sum_lt_top
+-/
end WithTop
@@ -729,27 +843,35 @@ section AbsoluteValue
variable {S : Type _}
+#print AbsoluteValue.sum_le /-
theorem AbsoluteValue.sum_le [Semiring R] [OrderedSemiring S] (abv : AbsoluteValue R S)
(s : Finset ι) (f : ι → R) : abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) :=
Finset.le_sum_of_subadditive abv (map_zero _) abv.add_le _ _
#align absolute_value.sum_le AbsoluteValue.sum_le
+-/
+#print IsAbsoluteValue.abv_sum /-
theorem IsAbsoluteValue.abv_sum [Semiring R] [OrderedSemiring S] (abv : R → S) [IsAbsoluteValue abv]
(f : ι → R) (s : Finset ι) : abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) :=
(IsAbsoluteValue.toAbsoluteValue abv).sum_le _ _
#align is_absolute_value.abv_sum IsAbsoluteValue.abv_sum
+-/
+#print AbsoluteValue.map_prod /-
theorem AbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedCommRing S]
(abv : AbsoluteValue R S) (f : ι → R) (s : Finset ι) :
abv (∏ i in s, f i) = ∏ i in s, abv (f i) :=
abv.toMonoidHom.map_prod f s
#align absolute_value.map_prod AbsoluteValue.map_prod
+-/
+#print IsAbsoluteValue.map_prod /-
theorem IsAbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedCommRing S]
(abv : R → S) [IsAbsoluteValue abv] (f : ι → R) (s : Finset ι) :
abv (∏ i in s, f i) = ∏ i in s, abv (f i) :=
(IsAbsoluteValue.toAbsoluteValue abv).map_prod _ _
#align is_absolute_value.map_prod IsAbsoluteValue.map_prod
+-/
end AbsoluteValue
mathlib commit https://github.com/leanprover-community/mathlib/commit/a3e83f0fa4391c8740f7d773a7a9b74e311ae2a3
@@ -118,7 +118,7 @@ variable {f g : ι → N} {s t : Finset ι}
equal to the corresponding factor `g i` of another finite product, then
`∏ i in s, f i ≤ ∏ i in s, g i`. -/
@[to_additive sum_le_sum]
-theorem prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) : (∏ i in s, f i) ≤ ∏ i in s, g i :=
+theorem prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) : ∏ i in s, f i ≤ ∏ i in s, g i :=
Multiset.prod_map_le_prod_map f g h
#align finset.prod_le_prod' Finset.prod_le_prod'
#align finset.sum_le_sum Finset.sum_le_sum
@@ -141,16 +141,16 @@ theorem one_le_prod'' (h : ∀ i : ι, 1 ≤ f i) : 1 ≤ ∏ i : ι in s, f i :
#align finset.sum_nonneg' Finset.sum_nonneg'
@[to_additive sum_nonpos]
-theorem prod_le_one' (h : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 :=
+theorem prod_le_one' (h : ∀ i ∈ s, f i ≤ 1) : ∏ i in s, f i ≤ 1 :=
(prod_le_prod' h).trans_eq (by rw [prod_const_one])
#align finset.prod_le_one' Finset.prod_le_one'
#align finset.sum_nonpos Finset.sum_nonpos
@[to_additive sum_le_sum_of_subset_of_nonneg]
theorem prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉ s → 1 ≤ f i) :
- (∏ i in s, f i) ≤ ∏ i in t, f i := by
+ ∏ i in s, f i ≤ ∏ i in t, f i := by
classical calc
- (∏ i in s, f i) ≤ (∏ i in t \ s, f i) * ∏ i in s, f i :=
+ ∏ i in s, f i ≤ (∏ i in t \ s, f i) * ∏ i in s, f i :=
le_mul_of_one_le_left' <| one_le_prod' <| by simpa only [mem_sdiff, and_imp]
_ = ∏ i in t \ s ∪ s, f i := (prod_union sdiff_disjoint).symm
_ = ∏ i in t, f i := by rw [sdiff_union_of_subset h]
@@ -165,14 +165,14 @@ theorem prod_mono_set_of_one_le' (hf : ∀ x, 1 ≤ f x) : Monotone fun s => ∏
@[to_additive sum_le_univ_sum_of_nonneg]
theorem prod_le_univ_prod_of_one_le' [Fintype ι] {s : Finset ι} (w : ∀ x, 1 ≤ f x) :
- (∏ x in s, f x) ≤ ∏ x, f x :=
+ ∏ x in s, f x ≤ ∏ x, f x :=
prod_le_prod_of_subset_of_one_le' (subset_univ s) fun a _ _ => w a
#align finset.prod_le_univ_prod_of_one_le' Finset.prod_le_univ_prod_of_one_le'
#align finset.sum_le_univ_sum_of_nonneg Finset.sum_le_univ_sum_of_nonneg
@[to_additive sum_eq_zero_iff_of_nonneg]
-theorem prod_eq_one_iff_of_one_le' :
- (∀ i ∈ s, 1 ≤ f i) → ((∏ i in s, f i) = 1 ↔ ∀ i ∈ s, f i = 1) := by
+theorem prod_eq_one_iff_of_one_le' : (∀ i ∈ s, 1 ≤ f i) → (∏ i in s, f i = 1 ↔ ∀ i ∈ s, f i = 1) :=
+ by
classical
apply Finset.induction_on s
exact fun _ => ⟨fun _ _ => False.elim, fun _ => rfl⟩
@@ -184,8 +184,7 @@ theorem prod_eq_one_iff_of_one_le' :
#align finset.sum_eq_zero_iff_of_nonneg Finset.sum_eq_zero_iff_of_nonneg
@[to_additive sum_eq_zero_iff_of_nonneg]
-theorem prod_eq_one_iff_of_le_one' :
- (∀ i ∈ s, f i ≤ 1) → ((∏ i in s, f i) = 1 ↔ ∀ i ∈ s, f i = 1) :=
+theorem prod_eq_one_iff_of_le_one' : (∀ i ∈ s, f i ≤ 1) → (∏ i in s, f i = 1 ↔ ∀ i ∈ s, f i = 1) :=
@prod_eq_one_iff_of_one_le' _ Nᵒᵈ _ _ _
#align finset.prod_eq_one_iff_of_le_one' Finset.prod_eq_one_iff_of_le_one'
#align finset.sum_eq_zero_iff_of_nonneg Finset.sum_eq_zero_iff_of_nonneg
@@ -229,9 +228,9 @@ variable {ι' : Type _} [DecidableEq ι']
@[to_additive sum_fiberwise_le_sum_of_sum_fiber_nonneg]
theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
(h : ∀ (y) (_ : y ∉ t), (1 : N) ≤ ∏ x in s.filterₓ fun x => g x = y, f x) :
- (∏ y in t, ∏ x in s.filterₓ fun x => g x = y, f x) ≤ ∏ x in s, f x :=
+ ∏ y in t, ∏ x in s.filterₓ fun x => g x = y, f x ≤ ∏ x in s, f x :=
calc
- (∏ y in t, ∏ x in s.filterₓ fun x => g x = y, f x) ≤
+ ∏ y in t, ∏ x in s.filterₓ fun x => g x = y, f x ≤
∏ y in t ∪ s.image g, ∏ x in s.filterₓ fun x => g x = y, f x :=
prod_le_prod_of_subset_of_one_le' (subset_union_left _ _) fun y hyts => h y
_ = ∏ x in s, f x :=
@@ -242,8 +241,8 @@ theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι
/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (y «expr ∉ » t) -/
@[to_additive sum_le_sum_fiberwise_of_sum_fiber_nonpos]
theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
- (h : ∀ (y) (_ : y ∉ t), (∏ x in s.filterₓ fun x => g x = y, f x) ≤ 1) :
- (∏ x in s, f x) ≤ ∏ y in t, ∏ x in s.filterₓ fun x => g x = y, f x :=
+ (h : ∀ (y) (_ : y ∉ t), ∏ x in s.filterₓ fun x => g x = y, f x ≤ 1) :
+ ∏ x in s, f x ≤ ∏ y in t, ∏ x in s.filterₓ fun x => g x = y, f x :=
@prod_fiberwise_le_prod_of_one_le_prod_fiber' _ Nᵒᵈ _ _ _ _ _ _ _ h
#align finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one'
#align finset.sum_le_sum_fiberwise_of_sum_fiber_nonpos Finset.sum_le_sum_fiberwise_of_sum_fiber_nonpos
@@ -312,7 +311,7 @@ variable [DecidableEq α] {s : Finset α} {B : Finset (Finset α)} {n : ℕ}
/-- If every element belongs to at most `n` finsets, then the sum of their sizes is at most `n`
times how many they are. -/
theorem sum_card_inter_le (h : ∀ a ∈ s, (B.filterₓ <| (· ∈ ·) a).card ≤ n) :
- (∑ t in B, (s ∩ t).card) ≤ s.card * n :=
+ ∑ t in B, (s ∩ t).card ≤ s.card * n :=
by
refine' le_trans _ (s.sum_le_card_nsmul _ _ h)
simp_rw [← filter_mem_eq_inter, card_eq_sum_ones, sum_filter]
@@ -324,9 +323,9 @@ theorem sum_card_inter_le (h : ∀ a ∈ s, (B.filterₓ <| (· ∈ ·) a).card
/-- If every element belongs to at most `n` finsets, then the sum of their sizes is at most `n`
times how many they are. -/
theorem sum_card_le [Fintype α] (h : ∀ a, (B.filterₓ <| (· ∈ ·) a).card ≤ n) :
- (∑ s in B, s.card) ≤ Fintype.card α * n :=
+ ∑ s in B, s.card ≤ Fintype.card α * n :=
calc
- (∑ s in B, s.card) = ∑ s in B, (univ ∩ s).card := by simp_rw [univ_inter]
+ ∑ s in B, s.card = ∑ s in B, (univ ∩ s).card := by simp_rw [univ_inter]
_ ≤ Fintype.card α * n := sum_card_inter_le fun a _ => h a
#align finset.sum_card_le Finset.sum_card_le
-/
@@ -358,7 +357,7 @@ theorem le_sum_card [Fintype α] (h : ∀ a, n ≤ (B.filterₓ <| (· ∈ ·) a
/-- If every element belongs to exactly `n` finsets, then the sum of their sizes is `n` times how
many they are. -/
theorem sum_card_inter (h : ∀ a ∈ s, (B.filterₓ <| (· ∈ ·) a).card = n) :
- (∑ t in B, (s ∩ t).card) = s.card * n :=
+ ∑ t in B, (s ∩ t).card = s.card * n :=
(sum_card_inter_le fun a ha => (h a ha).le).antisymm (le_sum_card_inter fun a ha => (h a ha).ge)
#align finset.sum_card_inter Finset.sum_card_inter
-/
@@ -367,7 +366,7 @@ theorem sum_card_inter (h : ∀ a ∈ s, (B.filterₓ <| (· ∈ ·) a).card = n
/-- If every element belongs to exactly `n` finsets, then the sum of their sizes is `n` times how
many they are. -/
theorem sum_card [Fintype α] (h : ∀ a, (B.filterₓ <| (· ∈ ·) a).card = n) :
- (∑ s in B, s.card) = Fintype.card α * n := by
+ ∑ s in B, s.card = Fintype.card α * n := by
simp_rw [Fintype.card, ← sum_card_inter fun a _ => h a, univ_inter]
#align finset.sum_card Finset.sum_card
-/
@@ -404,13 +403,13 @@ section CanonicallyOrderedMonoid
variable [CanonicallyOrderedMonoid M] {f : ι → M} {s t : Finset ι}
@[simp, to_additive sum_eq_zero_iff]
-theorem prod_eq_one_iff' : (∏ x in s, f x) = 1 ↔ ∀ x ∈ s, f x = 1 :=
+theorem prod_eq_one_iff' : ∏ x in s, f x = 1 ↔ ∀ x ∈ s, f x = 1 :=
prod_eq_one_iff_of_one_le' fun x hx => one_le (f x)
#align finset.prod_eq_one_iff' Finset.prod_eq_one_iff'
#align finset.sum_eq_zero_iff Finset.sum_eq_zero_iff
@[to_additive sum_le_sum_of_subset]
-theorem prod_le_prod_of_subset' (h : s ⊆ t) : (∏ x in s, f x) ≤ ∏ x in t, f x :=
+theorem prod_le_prod_of_subset' (h : s ⊆ t) : ∏ x in s, f x ≤ ∏ x in t, f x :=
prod_le_prod_of_subset_of_one_le' h fun x h₁ h₂ => one_le _
#align finset.prod_le_prod_of_subset' Finset.prod_le_prod_of_subset'
#align finset.sum_le_sum_of_subset Finset.sum_le_sum_of_subset
@@ -422,10 +421,9 @@ theorem prod_mono_set' (f : ι → M) : Monotone fun s => ∏ x in s, f x := fun
#align finset.sum_mono_set Finset.sum_mono_set
@[to_additive sum_le_sum_of_ne_zero]
-theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : (∏ x in s, f x) ≤ ∏ x in t, f x :=
- by
+theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : ∏ x in s, f x ≤ ∏ x in t, f x := by
classical calc
- (∏ x in s, f x) =
+ ∏ x in s, f x =
(∏ x in s.filter fun x => f x = 1, f x) * ∏ x in s.filter fun x => f x ≠ 1, f x :=
by
rw [← prod_union, filter_union_filter_neg_eq] <;>
@@ -445,7 +443,7 @@ variable [OrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
@[to_additive sum_lt_sum]
theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i < g i) :
- (∏ i in s, f i) < ∏ i in s, g i := by
+ ∏ i in s, f i < ∏ i in s, g i := by
classical
rcases Hlt with ⟨i, hi, hlt⟩
rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
@@ -455,7 +453,7 @@ theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i <
@[to_additive sum_lt_sum_of_nonempty]
theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g i) :
- (∏ i in s, f i) < ∏ i in s, g i := by
+ ∏ i in s, f i < ∏ i in s, g i := by
apply prod_lt_prod'
· intro i hi; apply le_of_lt (Hlt i hi)
cases' hs with i hi
@@ -465,9 +463,9 @@ theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g
@[to_additive sum_lt_sum_of_subset]
theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i ∉ s) (hlt : 1 < f i)
- (hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : (∏ j in s, f j) < ∏ j in t, f j := by
+ (hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : ∏ j in s, f j < ∏ j in t, f j := by
classical calc
- (∏ j in s, f j) < ∏ j in insert i s, f j :=
+ ∏ j in s, f j < ∏ j in insert i s, f j :=
by
rw [prod_insert hs]
exact lt_mul_of_one_lt_left' (∏ j in s, f j) hlt
@@ -498,7 +496,7 @@ theorem one_lt_prod (h : ∀ i ∈ s, 1 < f i) (hs : s.Nonempty) : 1 < ∏ i in
#align finset.sum_pos Finset.sum_pos
@[to_additive]
-theorem prod_lt_one (h : ∀ i ∈ s, f i < 1) (hs : s.Nonempty) : (∏ i in s, f i) < 1 :=
+theorem prod_lt_one (h : ∀ i ∈ s, f i < 1) (hs : s.Nonempty) : ∏ i in s, f i < 1 :=
(prod_lt_prod_of_nonempty' hs h).trans_le (by rw [prod_const_one])
#align finset.prod_lt_one Finset.prod_lt_one
#align finset.sum_neg Finset.sum_neg
@@ -510,14 +508,14 @@ theorem one_lt_prod' (h : ∀ i ∈ s, 1 ≤ f i) (hs : ∃ i ∈ s, 1 < f i) :
#align finset.sum_pos' Finset.sum_pos'
@[to_additive]
-theorem prod_lt_one' (h : ∀ i ∈ s, f i ≤ 1) (hs : ∃ i ∈ s, f i < 1) : (∏ i in s, f i) < 1 :=
+theorem prod_lt_one' (h : ∀ i ∈ s, f i ≤ 1) (hs : ∃ i ∈ s, f i < 1) : ∏ i in s, f i < 1 :=
prod_const_one.le.trans_lt' <| prod_lt_prod' h hs
#align finset.prod_lt_one' Finset.prod_lt_one'
#align finset.sum_neg' Finset.sum_neg'
@[to_additive]
theorem prod_eq_prod_iff_of_le {f g : ι → M} (h : ∀ i ∈ s, f i ≤ g i) :
- ((∏ i in s, f i) = ∏ i in s, g i) ↔ ∀ i ∈ s, f i = g i := by
+ ∏ i in s, f i = ∏ i in s, g i ↔ ∀ i ∈ s, f i = g i := by
classical
revert h
refine'
@@ -537,7 +535,7 @@ section LinearOrderedCancelCommMonoid
variable [LinearOrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
@[to_additive exists_lt_of_sum_lt]
-theorem exists_lt_of_prod_lt' (Hlt : (∏ i in s, f i) < ∏ i in s, g i) : ∃ i ∈ s, f i < g i :=
+theorem exists_lt_of_prod_lt' (Hlt : ∏ i in s, f i < ∏ i in s, g i) : ∃ i ∈ s, f i < g i :=
by
contrapose! Hlt with Hle
exact prod_le_prod' Hle
@@ -545,7 +543,7 @@ theorem exists_lt_of_prod_lt' (Hlt : (∏ i in s, f i) < ∏ i in s, g i) : ∃
#align finset.exists_lt_of_sum_lt Finset.exists_lt_of_sum_lt
@[to_additive exists_le_of_sum_le]
-theorem exists_le_of_prod_le' (hs : s.Nonempty) (Hle : (∏ i in s, f i) ≤ ∏ i in s, g i) :
+theorem exists_le_of_prod_le' (hs : s.Nonempty) (Hle : ∏ i in s, f i ≤ ∏ i in s, g i) :
∃ i ∈ s, f i ≤ g i := by
contrapose! Hle with Hlt
exact prod_lt_prod_of_nonempty' hs Hlt
@@ -553,14 +551,14 @@ theorem exists_le_of_prod_le' (hs : s.Nonempty) (Hle : (∏ i in s, f i) ≤ ∏
#align finset.exists_le_of_sum_le Finset.exists_le_of_sum_le
@[to_additive exists_pos_of_sum_zero_of_exists_nonzero]
-theorem exists_one_lt_of_prod_one_of_exists_ne_one' (f : ι → M) (h₁ : (∏ i in s, f i) = 1)
+theorem exists_one_lt_of_prod_one_of_exists_ne_one' (f : ι → M) (h₁ : ∏ i in s, f i = 1)
(h₂ : ∃ i ∈ s, f i ≠ 1) : ∃ i ∈ s, 1 < f i :=
by
contrapose! h₁
obtain ⟨i, m, i_ne⟩ : ∃ i ∈ s, f i ≠ 1 := h₂
apply ne_of_lt
calc
- (∏ j in s, f j) < ∏ j in s, 1 := prod_lt_prod' h₁ ⟨i, m, (h₁ i m).lt_of_ne i_ne⟩
+ ∏ j in s, f j < ∏ j in s, 1 := prod_lt_prod' h₁ ⟨i, m, (h₁ i m).lt_of_ne i_ne⟩
_ = 1 := prod_const_one
#align finset.exists_one_lt_of_prod_one_of_exists_ne_one' Finset.exists_one_lt_of_prod_one_of_exists_ne_one'
#align finset.exists_pos_of_sum_zero_of_exists_nonzero Finset.exists_pos_of_sum_zero_of_exists_nonzero
@@ -582,7 +580,7 @@ theorem prod_nonneg (h0 : ∀ i ∈ s, 0 ≤ f i) : 0 ≤ ∏ i in s, f i :=
product of `f i` is less than or equal to the product of `g i`. See also `finset.prod_le_prod'` for
the case of an ordered commutative multiplicative monoid. -/
theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g i) :
- (∏ i in s, f i) ≤ ∏ i in s, g i :=
+ ∏ i in s, f i ≤ ∏ i in s, g i :=
by
induction' s using Finset.induction with a s has ih h
· simp
@@ -595,7 +593,7 @@ theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g
/-- If each `f i`, `i ∈ s` belongs to `[0, 1]`, then their product is less than or equal to one.
See also `finset.prod_le_one'` for the case of an ordered commutative multiplicative monoid. -/
-theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 :=
+theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1) : ∏ i in s, f i ≤ 1 :=
by
convert ← prod_le_prod h0 h1
exact Finset.prod_const_one
@@ -605,7 +603,7 @@ theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1)
sum of the products of `g` and `h`. This is the version for `ordered_comm_semiring`. -/
theorem prod_add_prod_le {i : ι} {f g h : ι → R} (hi : i ∈ s) (h2i : g i + h i ≤ f i)
(hgf : ∀ j ∈ s, j ≠ i → g j ≤ f j) (hhf : ∀ j ∈ s, j ≠ i → h j ≤ f j) (hg : ∀ i ∈ s, 0 ≤ g i)
- (hh : ∀ i ∈ s, 0 ≤ h i) : ((∏ i in s, g i) + ∏ i in s, h i) ≤ ∏ i in s, f i :=
+ (hh : ∀ i ∈ s, 0 ≤ h i) : ∏ i in s, g i + ∏ i in s, h i ≤ ∏ i in s, f i :=
by
simp_rw [prod_eq_mul_prod_diff_singleton hi]
refine' le_trans _ (mul_le_mul_of_nonneg_right h2i _)
@@ -646,7 +644,7 @@ theorem CanonicallyOrderedCommSemiring.multiset_prod_pos [Nontrivial R] {m : Mul
/-- Note that the name is to match `canonically_ordered_comm_semiring.mul_pos`. -/
@[simp]
theorem CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
- (0 < ∏ i in s, f i) ↔ ∀ i ∈ s, (0 : R) < f i :=
+ 0 < ∏ i in s, f i ↔ ∀ i ∈ s, (0 : R) < f i :=
CanonicallyOrderedCommSemiring.multiset_prod_pos.trans <| by simp
#align canonically_ordered_comm_semiring.prod_pos CanonicallyOrderedCommSemiring.prod_pos
@@ -654,7 +652,7 @@ theorem CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
sum of the products of `g` and `h`. This is the version for `canonically_ordered_comm_semiring`.
-/
theorem prod_add_prod_le' (hi : i ∈ s) (h2i : g i + h i ≤ f i) (hgf : ∀ j ∈ s, j ≠ i → g j ≤ f j)
- (hhf : ∀ j ∈ s, j ≠ i → h j ≤ f j) : ((∏ i in s, g i) + ∏ i in s, h i) ≤ ∏ i in s, f i := by
+ (hhf : ∀ j ∈ s, j ≠ i → h j ≤ f j) : ∏ i in s, g i + ∏ i in s, h i ≤ ∏ i in s, f i := by
classical
simp_rw [prod_eq_mul_prod_diff_singleton hi]
refine' le_trans _ (mul_le_mul_right' h2i _)
@@ -702,26 +700,26 @@ open Finset
/-- A product of finite numbers is still finite -/
theorem prod_lt_top [CommMonoidWithZero R] [NoZeroDivisors R] [Nontrivial R] [DecidableEq R] [LT R]
- {s : Finset ι} {f : ι → WithTop R} (h : ∀ i ∈ s, f i ≠ ⊤) : (∏ i in s, f i) < ⊤ :=
+ {s : Finset ι} {f : ι → WithTop R} (h : ∀ i ∈ s, f i ≠ ⊤) : ∏ i in s, f i < ⊤ :=
prod_induction f (fun a => a < ⊤) (fun a b h₁ h₂ => mul_lt_top' h₁ h₂) (coe_lt_top 1) fun a ha =>
WithTop.lt_top_iff_ne_top.2 (h a ha)
#align with_top.prod_lt_top WithTop.prod_lt_top
/-- A sum of numbers is infinite iff one of them is infinite -/
theorem sum_eq_top_iff [AddCommMonoid M] {s : Finset ι} {f : ι → WithTop M} :
- (∑ i in s, f i) = ⊤ ↔ ∃ i ∈ s, f i = ⊤ := by
+ ∑ i in s, f i = ⊤ ↔ ∃ i ∈ s, f i = ⊤ := by
induction s using Finset.cons_induction <;> simp [*, or_and_right, exists_or]
#align with_top.sum_eq_top_iff WithTop.sum_eq_top_iff
/-- A sum of finite numbers is still finite -/
theorem sum_lt_top_iff [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M} :
- (∑ i in s, f i) < ⊤ ↔ ∀ i ∈ s, f i < ⊤ := by
+ ∑ i in s, f i < ⊤ ↔ ∀ i ∈ s, f i < ⊤ := by
simp only [WithTop.lt_top_iff_ne_top, Ne.def, sum_eq_top_iff, not_exists]
#align with_top.sum_lt_top_iff WithTop.sum_lt_top_iff
/-- A sum of finite numbers is still finite -/
theorem sum_lt_top [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M}
- (h : ∀ i ∈ s, f i ≠ ⊤) : (∑ i in s, f i) < ⊤ :=
+ (h : ∀ i ∈ s, f i ≠ ⊤) : ∑ i in s, f i < ⊤ :=
sum_lt_top_iff.2 fun i hi => WithTop.lt_top_iff_ne_top.2 (h i hi)
#align with_top.sum_lt_top WithTop.sum_lt_top
mathlib commit https://github.com/leanprover-community/mathlib/commit/7e5137f579de09a059a5ce98f364a04e221aabf0
@@ -154,7 +154,6 @@ theorem prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉
le_mul_of_one_le_left' <| one_le_prod' <| by simpa only [mem_sdiff, and_imp]
_ = ∏ i in t \ s ∪ s, f i := (prod_union sdiff_disjoint).symm
_ = ∏ i in t, f i := by rw [sdiff_union_of_subset h]
-
#align finset.prod_le_prod_of_subset_of_one_le' Finset.prod_le_prod_of_subset_of_one_le'
#align finset.sum_le_sum_of_subset_of_nonneg Finset.sum_le_sum_of_subset_of_nonneg
@@ -197,7 +196,6 @@ theorem single_le_prod' (hf : ∀ i ∈ s, 1 ≤ f i) {a} (h : a ∈ s) : f a
f a = ∏ i in {a}, f i := prod_singleton.symm
_ ≤ ∏ i in s, f i :=
prod_le_prod_of_subset_of_one_le' (singleton_subset_iff.2 h) fun i hi _ => hf i hi
-
#align finset.single_le_prod' Finset.single_le_prod'
#align finset.single_le_sum Finset.single_le_sum
@@ -238,7 +236,6 @@ theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι
prod_le_prod_of_subset_of_one_le' (subset_union_left _ _) fun y hyts => h y
_ = ∏ x in s, f x :=
prod_fiberwise_of_maps_to (fun x hx => mem_union.2 <| Or.inr <| mem_image_of_mem _ hx) _
-
#align finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber'
#align finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg Finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg
@@ -284,7 +281,6 @@ theorem card_le_mul_card_image_of_maps_to {f : α → β} {s : Finset α} {t : F
s.card = ∑ a in t, (s.filterₓ fun x => f x = a).card := card_eq_sum_card_fiberwise Hf
_ ≤ ∑ _ in t, n := (sum_le_sum hn)
_ = _ := by simp [mul_comm]
-
#align finset.card_le_mul_card_image_of_maps_to Finset.card_le_mul_card_image_of_maps_to
theorem card_le_mul_card_image {f : α → β} (s : Finset α) (n : ℕ)
@@ -299,7 +295,6 @@ theorem mul_card_image_le_card_of_maps_to {f : α → β} {s : Finset α} {t : F
n * t.card = ∑ _ in t, n := by simp [mul_comm]
_ ≤ ∑ a in t, (s.filterₓ fun x => f x = a).card := (sum_le_sum hn)
_ = s.card := by rw [← card_eq_sum_card_fiberwise Hf]
-
#align finset.mul_card_image_le_card_of_maps_to Finset.mul_card_image_le_card_of_maps_to
theorem mul_card_image_le_card {f : α → β} (s : Finset α) (n : ℕ)
@@ -333,7 +328,6 @@ theorem sum_card_le [Fintype α] (h : ∀ a, (B.filterₓ <| (· ∈ ·) a).card
calc
(∑ s in B, s.card) = ∑ s in B, (univ ∩ s).card := by simp_rw [univ_inter]
_ ≤ Fintype.card α * n := sum_card_inter_le fun a _ => h a
-
#align finset.sum_card_le Finset.sum_card_le
-/
@@ -357,7 +351,6 @@ theorem le_sum_card [Fintype α] (h : ∀ a, n ≤ (B.filterₓ <| (· ∈ ·) a
calc
Fintype.card α * n ≤ ∑ s in B, (univ ∩ s).card := le_sum_card_inter fun a _ => h a
_ = ∑ s in B, s.card := by simp_rw [univ_inter]
-
#align finset.le_sum_card Finset.le_sum_card
-/
@@ -441,7 +434,6 @@ theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : (∏
mul_le_of_le_one_of_le
(prod_le_one' <| by simp only [mem_filter, and_imp] <;> exact fun _ _ => le_of_eq)
(prod_le_prod_of_subset' <| by simpa only [subset_iff, mem_filter, and_imp])
-
#align finset.prod_le_prod_of_ne_one' Finset.prod_le_prod_of_ne_one'
#align finset.sum_le_sum_of_ne_zero Finset.sum_le_sum_of_ne_zero
@@ -485,7 +477,6 @@ theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i
· intro x hx h'x
simp only [mem_insert, not_or] at h'x
exact hle x hx h'x.2
-
#align finset.prod_lt_prod_of_subset' Finset.prod_lt_prod_of_subset'
#align finset.sum_lt_sum_of_subset Finset.sum_lt_sum_of_subset
@@ -497,7 +488,6 @@ theorem single_lt_prod' {i j : ι} (hij : j ≠ i) (hi : i ∈ s) (hj : j ∈ s)
_ < ∏ k in s, f k :=
prod_lt_prod_of_subset' (singleton_subset_iff.2 hi) hj (mt mem_singleton.1 hij) hlt
fun k hks hki => hle k hks (mt mem_singleton.2 hki)
-
#align finset.single_lt_prod' Finset.single_lt_prod'
#align finset.single_lt_sum Finset.single_lt_sum
@@ -572,7 +562,6 @@ theorem exists_one_lt_of_prod_one_of_exists_ne_one' (f : ι → M) (h₁ : (∏
calc
(∏ j in s, f j) < ∏ j in s, 1 := prod_lt_prod' h₁ ⟨i, m, (h₁ i m).lt_of_ne i_ne⟩
_ = 1 := prod_const_one
-
#align finset.exists_one_lt_of_prod_one_of_exists_ne_one' Finset.exists_one_lt_of_prod_one_of_exists_ne_one'
#align finset.exists_pos_of_sum_zero_of_exists_nonzero Finset.exists_pos_of_sum_zero_of_exists_nonzero
mathlib commit https://github.com/leanprover-community/mathlib/commit/31c24aa72e7b3e5ed97a8412470e904f82b81004
@@ -227,7 +227,7 @@ theorem card_biUnion_le_card_mul [DecidableEq β] (s : Finset ι) (f : ι → Fi
variable {ι' : Type _} [DecidableEq ι']
-/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (y «expr ∉ » t) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (y «expr ∉ » t) -/
@[to_additive sum_fiberwise_le_sum_of_sum_fiber_nonneg]
theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
(h : ∀ (y) (_ : y ∉ t), (1 : N) ≤ ∏ x in s.filterₓ fun x => g x = y, f x) :
@@ -242,7 +242,7 @@ theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι
#align finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber'
#align finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg Finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg
-/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (y «expr ∉ » t) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:638:2: warning: expanding binder collection (y «expr ∉ » t) -/
@[to_additive sum_le_sum_fiberwise_of_sum_fiber_nonpos]
theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
(h : ∀ (y) (_ : y ∉ t), (∏ x in s.filterₓ fun x => g x = y, f x) ≤ 1) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/5f25c089cb34db4db112556f23c50d12da81b297
@@ -150,11 +150,11 @@ theorem prod_le_one' (h : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 :=
theorem prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉ s → 1 ≤ f i) :
(∏ i in s, f i) ≤ ∏ i in t, f i := by
classical calc
- (∏ i in s, f i) ≤ (∏ i in t \ s, f i) * ∏ i in s, f i :=
- le_mul_of_one_le_left' <| one_le_prod' <| by simpa only [mem_sdiff, and_imp]
- _ = ∏ i in t \ s ∪ s, f i := (prod_union sdiff_disjoint).symm
- _ = ∏ i in t, f i := by rw [sdiff_union_of_subset h]
-
+ (∏ i in s, f i) ≤ (∏ i in t \ s, f i) * ∏ i in s, f i :=
+ le_mul_of_one_le_left' <| one_le_prod' <| by simpa only [mem_sdiff, and_imp]
+ _ = ∏ i in t \ s ∪ s, f i := (prod_union sdiff_disjoint).symm
+ _ = ∏ i in t, f i := by rw [sdiff_union_of_subset h]
+
#align finset.prod_le_prod_of_subset_of_one_le' Finset.prod_le_prod_of_subset_of_one_le'
#align finset.sum_le_sum_of_subset_of_nonneg Finset.sum_le_sum_of_subset_of_nonneg
@@ -175,12 +175,12 @@ theorem prod_le_univ_prod_of_one_le' [Fintype ι] {s : Finset ι} (w : ∀ x, 1
theorem prod_eq_one_iff_of_one_le' :
(∀ i ∈ s, 1 ≤ f i) → ((∏ i in s, f i) = 1 ↔ ∀ i ∈ s, f i = 1) := by
classical
- apply Finset.induction_on s
- exact fun _ => ⟨fun _ _ => False.elim, fun _ => rfl⟩
- intro a s ha ih H
- have : ∀ i ∈ s, 1 ≤ f i := fun _ => H _ ∘ mem_insert_of_mem
- rw [prod_insert ha, mul_eq_one_iff' (H _ <| mem_insert_self _ _) (one_le_prod' this),
- forall_mem_insert, ih this]
+ apply Finset.induction_on s
+ exact fun _ => ⟨fun _ _ => False.elim, fun _ => rfl⟩
+ intro a s ha ih H
+ have : ∀ i ∈ s, 1 ≤ f i := fun _ => H _ ∘ mem_insert_of_mem
+ rw [prod_insert ha, mul_eq_one_iff' (H _ <| mem_insert_self _ _) (one_le_prod' this),
+ forall_mem_insert, ih this]
#align finset.prod_eq_one_iff_of_one_le' Finset.prod_eq_one_iff_of_one_le'
#align finset.sum_eq_zero_iff_of_nonneg Finset.sum_eq_zero_iff_of_nonneg
@@ -432,16 +432,16 @@ theorem prod_mono_set' (f : ι → M) : Monotone fun s => ∏ x in s, f x := fun
theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : (∏ x in s, f x) ≤ ∏ x in t, f x :=
by
classical calc
- (∏ x in s, f x) =
- (∏ x in s.filter fun x => f x = 1, f x) * ∏ x in s.filter fun x => f x ≠ 1, f x :=
- by
- rw [← prod_union, filter_union_filter_neg_eq] <;>
- exact disjoint_filter.2 fun _ _ h n_h => n_h h
- _ ≤ ∏ x in t, f x :=
- mul_le_of_le_one_of_le
- (prod_le_one' <| by simp only [mem_filter, and_imp] <;> exact fun _ _ => le_of_eq)
- (prod_le_prod_of_subset' <| by simpa only [subset_iff, mem_filter, and_imp])
-
+ (∏ x in s, f x) =
+ (∏ x in s.filter fun x => f x = 1, f x) * ∏ x in s.filter fun x => f x ≠ 1, f x :=
+ by
+ rw [← prod_union, filter_union_filter_neg_eq] <;>
+ exact disjoint_filter.2 fun _ _ h n_h => n_h h
+ _ ≤ ∏ x in t, f x :=
+ mul_le_of_le_one_of_le
+ (prod_le_one' <| by simp only [mem_filter, and_imp] <;> exact fun _ _ => le_of_eq)
+ (prod_le_prod_of_subset' <| by simpa only [subset_iff, mem_filter, and_imp])
+
#align finset.prod_le_prod_of_ne_one' Finset.prod_le_prod_of_ne_one'
#align finset.sum_le_sum_of_ne_zero Finset.sum_le_sum_of_ne_zero
@@ -455,9 +455,9 @@ variable [OrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i < g i) :
(∏ i in s, f i) < ∏ i in s, g i := by
classical
- rcases Hlt with ⟨i, hi, hlt⟩
- rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
- exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod' fun j hj => Hle j <| mem_of_mem_erase hj)
+ rcases Hlt with ⟨i, hi, hlt⟩
+ rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
+ exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod' fun j hj => Hle j <| mem_of_mem_erase hj)
#align finset.prod_lt_prod' Finset.prod_lt_prod'
#align finset.sum_lt_sum Finset.sum_lt_sum
@@ -475,17 +475,17 @@ theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g
theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i ∉ s) (hlt : 1 < f i)
(hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : (∏ j in s, f j) < ∏ j in t, f j := by
classical calc
- (∏ j in s, f j) < ∏ j in insert i s, f j :=
- by
- rw [prod_insert hs]
- exact lt_mul_of_one_lt_left' (∏ j in s, f j) hlt
- _ ≤ ∏ j in t, f j := by
- apply prod_le_prod_of_subset_of_one_le'
- · simp [Finset.insert_subset, h, ht]
- · intro x hx h'x
- simp only [mem_insert, not_or] at h'x
- exact hle x hx h'x.2
-
+ (∏ j in s, f j) < ∏ j in insert i s, f j :=
+ by
+ rw [prod_insert hs]
+ exact lt_mul_of_one_lt_left' (∏ j in s, f j) hlt
+ _ ≤ ∏ j in t, f j := by
+ apply prod_le_prod_of_subset_of_one_le'
+ · simp [Finset.insert_subset, h, ht]
+ · intro x hx h'x
+ simp only [mem_insert, not_or] at h'x
+ exact hle x hx h'x.2
+
#align finset.prod_lt_prod_of_subset' Finset.prod_lt_prod_of_subset'
#align finset.sum_lt_sum_of_subset Finset.sum_lt_sum_of_subset
@@ -529,14 +529,14 @@ theorem prod_lt_one' (h : ∀ i ∈ s, f i ≤ 1) (hs : ∃ i ∈ s, f i < 1) :
theorem prod_eq_prod_iff_of_le {f g : ι → M} (h : ∀ i ∈ s, f i ≤ g i) :
((∏ i in s, f i) = ∏ i in s, g i) ↔ ∀ i ∈ s, f i = g i := by
classical
- revert h
- refine'
- Finset.induction_on s (fun _ => ⟨fun _ _ => False.elim, fun _ => rfl⟩) fun a s ha ih H => _
- specialize ih fun i => H i ∘ Finset.mem_insert_of_mem
- rw [Finset.prod_insert ha, Finset.prod_insert ha, Finset.forall_mem_insert, ← ih]
- exact
- mul_eq_mul_iff_eq_and_eq (H a (s.mem_insert_self a))
- (Finset.prod_le_prod' fun i => H i ∘ Finset.mem_insert_of_mem)
+ revert h
+ refine'
+ Finset.induction_on s (fun _ => ⟨fun _ _ => False.elim, fun _ => rfl⟩) fun a s ha ih H => _
+ specialize ih fun i => H i ∘ Finset.mem_insert_of_mem
+ rw [Finset.prod_insert ha, Finset.prod_insert ha, Finset.forall_mem_insert, ← ih]
+ exact
+ mul_eq_mul_iff_eq_and_eq (H a (s.mem_insert_self a))
+ (Finset.prod_le_prod' fun i => H i ∘ Finset.mem_insert_of_mem)
#align finset.prod_eq_prod_iff_of_le Finset.prod_eq_prod_iff_of_le
#align finset.sum_eq_sum_iff_of_le Finset.sum_eq_sum_iff_of_le
@@ -608,7 +608,7 @@ theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g
See also `finset.prod_le_one'` for the case of an ordered commutative multiplicative monoid. -/
theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 :=
by
- convert← prod_le_prod h0 h1
+ convert ← prod_le_prod h0 h1
exact Finset.prod_const_one
#align finset.prod_le_one Finset.prod_le_one
@@ -667,14 +667,14 @@ theorem CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
theorem prod_add_prod_le' (hi : i ∈ s) (h2i : g i + h i ≤ f i) (hgf : ∀ j ∈ s, j ≠ i → g j ≤ f j)
(hhf : ∀ j ∈ s, j ≠ i → h j ≤ f j) : ((∏ i in s, g i) + ∏ i in s, h i) ≤ ∏ i in s, f i := by
classical
- simp_rw [prod_eq_mul_prod_diff_singleton hi]
- refine' le_trans _ (mul_le_mul_right' h2i _)
- rw [right_distrib]
- apply add_le_add <;> apply mul_le_mul_left' <;> apply prod_le_prod' <;>
- simp only [and_imp, mem_sdiff, mem_singleton] <;>
- intros <;>
- apply_assumption <;>
- assumption
+ simp_rw [prod_eq_mul_prod_diff_singleton hi]
+ refine' le_trans _ (mul_le_mul_right' h2i _)
+ rw [right_distrib]
+ apply add_le_add <;> apply mul_le_mul_left' <;> apply prod_le_prod' <;>
+ simp only [and_imp, mem_sdiff, mem_singleton] <;>
+ intros <;>
+ apply_assumption <;>
+ assumption
#align finset.prod_add_prod_le' Finset.prod_add_prod_le'
end CanonicallyOrderedCommSemiring
mathlib commit https://github.com/leanprover-community/mathlib/commit/cca40788df1b8755d5baf17ab2f27dacc2e17acb
@@ -440,7 +440,7 @@ theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : (∏
_ ≤ ∏ x in t, f x :=
mul_le_of_le_one_of_le
(prod_le_one' <| by simp only [mem_filter, and_imp] <;> exact fun _ _ => le_of_eq)
- (prod_le_prod_of_subset' <| by simpa only [subset_iff, mem_filter, and_imp] )
+ (prod_le_prod_of_subset' <| by simpa only [subset_iff, mem_filter, and_imp])
#align finset.prod_le_prod_of_ne_one' Finset.prod_le_prod_of_ne_one'
#align finset.sum_le_sum_of_ne_zero Finset.sum_le_sum_of_ne_zero
@@ -483,7 +483,7 @@ theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i
apply prod_le_prod_of_subset_of_one_le'
· simp [Finset.insert_subset, h, ht]
· intro x hx h'x
- simp only [mem_insert, not_or] at h'x
+ simp only [mem_insert, not_or] at h'x
exact hle x hx h'x.2
#align finset.prod_lt_prod_of_subset' Finset.prod_lt_prod_of_subset'
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -26,7 +26,7 @@ Mostly monotonicity results for the `∏` and `∑` operations.
open Function
-open BigOperators
+open scoped BigOperators
variable {ι α β M N G k R : Type _}
@@ -582,7 +582,7 @@ section OrderedCommSemiring
variable [OrderedCommSemiring R] {f g : ι → R} {s t : Finset ι}
-open Classical
+open scoped Classical
-- this is also true for a ordered commutative multiplicative monoid with zero
theorem prod_nonneg (h0 : ∀ i ∈ s, 0 ≤ f i) : 0 ≤ ∏ i in s, f i :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -36,12 +36,6 @@ section OrderedCommMonoid
variable [CommMonoid M] [OrderedCommMonoid N]
-/- warning: finset.le_prod_nonempty_of_submultiplicative_on_pred -> Finset.le_prod_nonempty_of_submultiplicative_on_pred is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N) (p : M -> Prop), (forall (x : M) (y : M), (p x) -> (p y) -> (LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toHasMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y)))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (p (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y))) -> (forall (g : ι -> M) (s : Finset.{u1} ι), (Finset.Nonempty.{u1} ι s) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (p (g i))) -> (LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
-but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N) (p : M -> Prop), (forall (x : M) (y : M), (p x) -> (p y) -> (LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y)))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (p (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y))) -> (forall (g : ι -> M) (s : Finset.{u1} ι), (Finset.Nonempty.{u1} ι s) -> (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (p (g i))) -> (LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
-Case conversion may be inaccurate. Consider using '#align finset.le_prod_nonempty_of_submultiplicative_on_pred Finset.le_prod_nonempty_of_submultiplicative_on_predₓ'. -/
/-- Let `{x | p x}` be a subsemigroup of a commutative monoid `M`. Let `f : M → N` be a map
submultiplicative on `{x | p x}`, i.e., `p x → p y → f (x * y) ≤ f x * f y`. Let `g i`, `i ∈ s`, be
a nonempty finite family of elements of `M` such that `∀ i ∈ s, p (g i)`. Then
@@ -66,12 +60,6 @@ theorem le_prod_nonempty_of_submultiplicative_on_pred (f : M → N) (p : M → P
`f (∑ i in s, g i) ≤ ∑ i in s, f (g i)`. -/
add_decl_doc le_sum_nonempty_of_subadditive_on_pred
-/- warning: finset.le_prod_nonempty_of_submultiplicative -> Finset.le_prod_nonempty_of_submultiplicative is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N), (forall (x : M) (y : M), LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toHasMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y))) -> (forall {s : Finset.{u1} ι}, (Finset.Nonempty.{u1} ι s) -> (forall (g : ι -> M), LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
-but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N), (forall (x : M) (y : M), LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y))) -> (forall {s : Finset.{u1} ι}, (Finset.Nonempty.{u1} ι s) -> (forall (g : ι -> M), LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
-Case conversion may be inaccurate. Consider using '#align finset.le_prod_nonempty_of_submultiplicative Finset.le_prod_nonempty_of_submultiplicativeₓ'. -/
/-- If `f : M → N` is a submultiplicative function, `f (x * y) ≤ f x * f y` and `g i`, `i ∈ s`, is a
nonempty finite family of elements of `M`, then `f (∏ i in s, g i) ≤ ∏ i in s, f (g i)`. -/
@[to_additive le_sum_nonempty_of_subadditive]
@@ -86,12 +74,6 @@ theorem le_prod_nonempty_of_submultiplicative (f : M → N) (h_mul : ∀ x y, f
nonempty finite family of elements of `M`, then `f (∑ i in s, g i) ≤ ∑ i in s, f (g i)`. -/
add_decl_doc le_sum_nonempty_of_subadditive
-/- warning: finset.le_prod_of_submultiplicative_on_pred -> Finset.le_prod_of_submultiplicative_on_pred is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N) (p : M -> Prop), (Eq.{succ u3} N (f (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1))))))) (OfNat.ofNat.{u3} N 1 (OfNat.mk.{u3} N 1 (One.one.{u3} N (MulOneClass.toHasOne.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2)))))))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toHasMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y)))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (p (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y))) -> (forall (g : ι -> M) {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (p (g i))) -> (LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
-but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N) (p : M -> Prop), (Eq.{succ u3} N (f (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1))))) (OfNat.ofNat.{u3} N 1 (One.toOfNat1.{u3} N (Monoid.toOne.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2)))))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y)))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (p (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y))) -> (forall (g : ι -> M) {s : Finset.{u1} ι}, (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (p (g i))) -> (LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
-Case conversion may be inaccurate. Consider using '#align finset.le_prod_of_submultiplicative_on_pred Finset.le_prod_of_submultiplicative_on_predₓ'. -/
/-- Let `{x | p x}` be a subsemigroup of a commutative monoid `M`. Let `f : M → N` be a map
such that `f 1 = 1` and `f` is submultiplicative on `{x | p x}`, i.e.,
`p x → p y → f (x * y) ≤ f x * f y`. Let `g i`, `i ∈ s`, be a finite family of elements of `M` such
@@ -113,12 +95,6 @@ Let `g i`, `i ∈ s`, be a finite family of elements of `M` such that `∀ i ∈
`f (∑ x in s, g x) ≤ ∑ x in s, f (g x)`. -/
add_decl_doc le_sum_of_subadditive_on_pred
-/- warning: finset.le_prod_of_submultiplicative -> Finset.le_prod_of_submultiplicative is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N), (Eq.{succ u3} N (f (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1))))))) (OfNat.ofNat.{u3} N 1 (OfNat.mk.{u3} N 1 (One.one.{u3} N (MulOneClass.toHasOne.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2)))))))) -> (forall (x : M) (y : M), LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toHasMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y))) -> (forall (s : Finset.{u1} ι) (g : ι -> M), LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i))))
-but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N), (Eq.{succ u3} N (f (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1))))) (OfNat.ofNat.{u3} N 1 (One.toOfNat1.{u3} N (Monoid.toOne.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2)))))) -> (forall (x : M) (y : M), LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y))) -> (forall (s : Finset.{u1} ι) (g : ι -> M), LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i))))
-Case conversion may be inaccurate. Consider using '#align finset.le_prod_of_submultiplicative Finset.le_prod_of_submultiplicativeₓ'. -/
/-- If `f : M → N` is a submultiplicative function, `f (x * y) ≤ f x * f y`, `f 1 = 1`, and `g i`,
`i ∈ s`, is a finite family of elements of `M`, then `f (∏ i in s, g i) ≤ ∏ i in s, f (g i)`. -/
@[to_additive le_sum_of_subadditive]
@@ -138,12 +114,6 @@ add_decl_doc le_sum_of_subadditive
variable {f g : ι → N} {s t : Finset ι}
-/- warning: finset.prod_le_prod' -> Finset.prod_le_prod' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {g : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f i) (g i))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => g i)))
-but is expected to have type
- forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {g : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (f i) (g i))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => g i)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod' Finset.prod_le_prod'ₓ'. -/
/-- In an ordered commutative monoid, if each factor `f i` of one finite product is less than or
equal to the corresponding factor `g i` of another finite product, then
`∏ i in s, f i ≤ ∏ i in s, g i`. -/
@@ -158,48 +128,24 @@ or equal to the corresponding summand `g i` of another finite sum, then
`∑ i in s, f i ≤ ∑ i in s, g i`. -/
add_decl_doc sum_le_sum
-/- warning: finset.one_le_prod' -> Finset.one_le_prod' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))) (f i))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align finset.one_le_prod' Finset.one_le_prod'ₓ'. -/
@[to_additive sum_nonneg]
theorem one_le_prod' (h : ∀ i ∈ s, 1 ≤ f i) : 1 ≤ ∏ i in s, f i :=
le_trans (by rw [prod_const_one]) (prod_le_prod' h)
#align finset.one_le_prod' Finset.one_le_prod'
#align finset.sum_nonneg Finset.sum_nonneg
-/- warning: finset.one_le_prod'' -> Finset.one_le_prod'' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i)) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (One.toOfNat1.{u2} N (Monoid.toOne.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))) (f i)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (One.toOfNat1.{u2} N (Monoid.toOne.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align finset.one_le_prod'' Finset.one_le_prod''ₓ'. -/
@[to_additive Finset.sum_nonneg']
theorem one_le_prod'' (h : ∀ i : ι, 1 ≤ f i) : 1 ≤ ∏ i : ι in s, f i :=
Finset.one_le_prod' fun i hi => h i
#align finset.one_le_prod'' Finset.one_le_prod''
#align finset.sum_nonneg' Finset.sum_nonneg'
-/- warning: finset.prod_le_one' -> Finset.prod_le_one' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f i) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))
-but is expected to have type
- forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (f i) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))))
-Case conversion may be inaccurate. Consider using '#align finset.prod_le_one' Finset.prod_le_one'ₓ'. -/
@[to_additive sum_nonpos]
theorem prod_le_one' (h : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 :=
(prod_le_prod' h).trans_eq (by rw [prod_const_one])
#align finset.prod_le_one' Finset.prod_le_one'
#align finset.sum_nonpos Finset.sum_nonpos
-/- warning: finset.prod_le_prod_of_subset_of_one_le' -> Finset.prod_le_prod_of_subset_of_one_le' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι} {t : Finset.{u1} ι}, (HasSubset.Subset.{u1} (Finset.{u1} ι) (Finset.hasSubset.{u1} ι) s t) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i t) -> (Not (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s)) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {s : Finset.{u2} ι} {t : Finset.{u2} ι}, (HasSubset.Subset.{u2} (Finset.{u2} ι) (Finset.instHasSubsetFinset.{u2} ι) s t) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i t) -> (Not (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s)) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))) (f i))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) t (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod_of_subset_of_one_le' Finset.prod_le_prod_of_subset_of_one_le'ₓ'. -/
@[to_additive sum_le_sum_of_subset_of_nonneg]
theorem prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉ s → 1 ≤ f i) :
(∏ i in s, f i) ≤ ∏ i in t, f i := by
@@ -212,24 +158,12 @@ theorem prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉
#align finset.prod_le_prod_of_subset_of_one_le' Finset.prod_le_prod_of_subset_of_one_le'
#align finset.sum_le_sum_of_subset_of_nonneg Finset.sum_le_sum_of_subset_of_nonneg
-/- warning: finset.prod_mono_set_of_one_le' -> Finset.prod_mono_set_of_one_le' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N}, (forall (x : ι), LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f x)) -> (Monotone.{u1, u2} (Finset.{u1} ι) N (PartialOrder.toPreorder.{u1} (Finset.{u1} ι) (Finset.partialOrder.{u1} ι)) (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2)) (fun (s : Finset.{u1} ι) => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)))
-but is expected to have type
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N}, (forall (x : ι), LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (One.toOfNat1.{u2} N (Monoid.toOne.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))) (f x)) -> (Monotone.{u1, u2} (Finset.{u1} ι) N (PartialOrder.toPreorder.{u1} (Finset.{u1} ι) (Finset.partialOrder.{u1} ι)) (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2)) (fun (s : Finset.{u1} ι) => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_mono_set_of_one_le' Finset.prod_mono_set_of_one_le'ₓ'. -/
@[to_additive sum_mono_set_of_nonneg]
theorem prod_mono_set_of_one_le' (hf : ∀ x, 1 ≤ f x) : Monotone fun s => ∏ x in s, f x :=
fun s t hst => prod_le_prod_of_subset_of_one_le' hst fun x _ _ => hf x
#align finset.prod_mono_set_of_one_le' Finset.prod_mono_set_of_one_le'
#align finset.sum_mono_set_of_nonneg Finset.sum_mono_set_of_nonneg
-/- warning: finset.prod_le_univ_prod_of_one_le' -> Finset.prod_le_univ_prod_of_one_le' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} [_inst_3 : Fintype.{u1} ι] {s : Finset.{u1} ι}, (forall (x : ι), LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f x)) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.univ.{u1} ι _inst_3) (fun (x : ι) => f x)))
-but is expected to have type
- forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} [_inst_3 : Fintype.{u2} ι] {s : Finset.{u2} ι}, (forall (x : ι), LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))) (f x)) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (x : ι) => f x)) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) (Finset.univ.{u2} ι _inst_3) (fun (x : ι) => f x)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_le_univ_prod_of_one_le' Finset.prod_le_univ_prod_of_one_le'ₓ'. -/
@[to_additive sum_le_univ_sum_of_nonneg]
theorem prod_le_univ_prod_of_one_le' [Fintype ι] {s : Finset ι} (w : ∀ x, 1 ≤ f x) :
(∏ x in s, f x) ≤ ∏ x, f x :=
@@ -237,12 +171,6 @@ theorem prod_le_univ_prod_of_one_le' [Fintype ι] {s : Finset ι} (w : ∀ x, 1
#align finset.prod_le_univ_prod_of_one_le' Finset.prod_le_univ_prod_of_one_le'
#align finset.sum_le_univ_sum_of_nonneg Finset.sum_le_univ_sum_of_nonneg
-/- warning: finset.prod_eq_one_iff_of_one_le' -> Finset.prod_eq_one_iff_of_one_le' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i))) -> (Iff (Eq.{succ u2} N (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2)))))))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Eq.{succ u2} N (f i) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))))
-but is expected to have type
- forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))) (f i))) -> (Iff (Eq.{succ u1} N (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2)))))) (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (Eq.{succ u1} N (f i) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))))))
-Case conversion may be inaccurate. Consider using '#align finset.prod_eq_one_iff_of_one_le' Finset.prod_eq_one_iff_of_one_le'ₓ'. -/
@[to_additive sum_eq_zero_iff_of_nonneg]
theorem prod_eq_one_iff_of_one_le' :
(∀ i ∈ s, 1 ≤ f i) → ((∏ i in s, f i) = 1 ↔ ∀ i ∈ s, f i = 1) := by
@@ -256,12 +184,6 @@ theorem prod_eq_one_iff_of_one_le' :
#align finset.prod_eq_one_iff_of_one_le' Finset.prod_eq_one_iff_of_one_le'
#align finset.sum_eq_zero_iff_of_nonneg Finset.sum_eq_zero_iff_of_nonneg
-/- warning: finset.prod_eq_one_iff_of_le_one' -> Finset.prod_eq_one_iff_of_le_one' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f i) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))) -> (Iff (Eq.{succ u2} N (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2)))))))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Eq.{succ u2} N (f i) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))))
-but is expected to have type
- forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (f i) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))))) -> (Iff (Eq.{succ u1} N (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2)))))) (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (Eq.{succ u1} N (f i) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))))))
-Case conversion may be inaccurate. Consider using '#align finset.prod_eq_one_iff_of_le_one' Finset.prod_eq_one_iff_of_le_one'ₓ'. -/
@[to_additive sum_eq_zero_iff_of_nonneg]
theorem prod_eq_one_iff_of_le_one' :
(∀ i ∈ s, f i ≤ 1) → ((∏ i in s, f i) = 1 ↔ ∀ i ∈ s, f i = 1) :=
@@ -269,12 +191,6 @@ theorem prod_eq_one_iff_of_le_one' :
#align finset.prod_eq_one_iff_of_le_one' Finset.prod_eq_one_iff_of_le_one'
#align finset.sum_eq_zero_iff_of_nonneg Finset.sum_eq_zero_iff_of_nonneg
-/- warning: finset.single_le_prod' -> Finset.single_le_prod' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i))) -> (forall {a : ι}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) a s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f a) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x))))
-but is expected to have type
- forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))) (f i))) -> (forall {a : ι}, (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) a s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (f a) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (x : ι) => f x))))
-Case conversion may be inaccurate. Consider using '#align finset.single_le_prod' Finset.single_le_prod'ₓ'. -/
@[to_additive single_le_sum]
theorem single_le_prod' (hf : ∀ i ∈ s, 1 ≤ f i) {a} (h : a ∈ s) : f a ≤ ∏ x in s, f x :=
calc
@@ -285,12 +201,6 @@ theorem single_le_prod' (hf : ∀ i ∈ s, 1 ≤ f i) {a} (h : a ∈ s) : f a
#align finset.single_le_prod' Finset.single_le_prod'
#align finset.single_le_sum Finset.single_le_sum
-/- warning: finset.prod_le_pow_card -> Finset.prod_le_pow_card is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] (s : Finset.{u1} ι) (f : ι -> N) (n : N), (forall (x : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f x) n)) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s f) (HPow.hPow.{u2, 0, u2} N Nat N (instHPow.{u2, 0} N Nat (Monoid.Pow.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2)))) n (Finset.card.{u1} ι s)))
-but is expected to have type
- forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] (s : Finset.{u2} ι) (f : ι -> N) (n : N), (forall (x : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) x s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (f x) n)) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s f) (HPow.hPow.{u1, 0, u1} N Nat N (instHPow.{u1, 0} N Nat (Monoid.Pow.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2)))) n (Finset.card.{u2} ι s)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_le_pow_card Finset.prod_le_pow_cardₓ'. -/
@[to_additive sum_le_card_nsmul]
theorem prod_le_pow_card (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s, f x ≤ n) :
s.Prod f ≤ n ^ s.card :=
@@ -301,12 +211,6 @@ theorem prod_le_pow_card (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s
#align finset.prod_le_pow_card Finset.prod_le_pow_card
#align finset.sum_le_card_nsmul Finset.sum_le_card_nsmul
-/- warning: finset.pow_card_le_prod -> Finset.pow_card_le_prod is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] (s : Finset.{u1} ι) (f : ι -> N) (n : N), (forall (x : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) n (f x))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (HPow.hPow.{u2, 0, u2} N Nat N (instHPow.{u2, 0} N Nat (Monoid.Pow.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2)))) n (Finset.card.{u1} ι s)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s f))
-but is expected to have type
- forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] (s : Finset.{u2} ι) (f : ι -> N) (n : N), (forall (x : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) x s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) n (f x))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (HPow.hPow.{u1, 0, u1} N Nat N (instHPow.{u1, 0} N Nat (Monoid.Pow.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2)))) n (Finset.card.{u2} ι s)) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s f))
-Case conversion may be inaccurate. Consider using '#align finset.pow_card_le_prod Finset.pow_card_le_prodₓ'. -/
@[to_additive card_nsmul_le_sum]
theorem pow_card_le_prod (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s, n ≤ f x) :
n ^ s.card ≤ s.Prod f :=
@@ -323,12 +227,6 @@ theorem card_biUnion_le_card_mul [DecidableEq β] (s : Finset ι) (f : ι → Fi
variable {ι' : Type _} [DecidableEq ι']
-/- warning: finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' -> Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {s : Finset.{u1} ι} {ι' : Type.{u3}} [_inst_3 : DecidableEq.{succ u3} ι'] {t : Finset.{u3} ι'} {g : ι -> ι'} {f : ι -> N}, (forall (y : ι'), (Not (Membership.Mem.{u3, u3} ι' (Finset.{u3} ι') (Finset.hasMem.{u3} ι') y t)) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x)))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u3} N ι' (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (y : ι') => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)))
-but is expected to have type
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {s : Finset.{u1} ι} {ι' : Type.{u3}} [_inst_3 : DecidableEq.{succ u3} ι'] {t : Finset.{u3} ι'} {g : ι -> ι'} {f : ι -> N}, (forall (y : ι'), (Not (Membership.mem.{u3, u3} ι' (Finset.{u3} ι') (Finset.instMembershipFinset.{u3} ι') y t)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (One.toOfNat1.{u2} N (Monoid.toOne.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x)))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u3} N ι' (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (y : ι') => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber'ₓ'. -/
/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (y «expr ∉ » t) -/
@[to_additive sum_fiberwise_le_sum_of_sum_fiber_nonneg]
theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
@@ -344,12 +242,6 @@ theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι
#align finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber'
#align finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg Finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg
-/- warning: finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' -> Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {s : Finset.{u1} ι} {ι' : Type.{u3}} [_inst_3 : DecidableEq.{succ u3} ι'] {t : Finset.{u3} ι'} {g : ι -> ι'} {f : ι -> N}, (forall (y : ι'), (Not (Membership.Mem.{u3, u3} ι' (Finset.{u3} ι') (Finset.hasMem.{u3} ι') y t)) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x)) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)) (Finset.prod.{u2, u3} N ι' (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (y : ι') => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x))))
-but is expected to have type
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {s : Finset.{u1} ι} {ι' : Type.{u3}} [_inst_3 : DecidableEq.{succ u3} ι'] {t : Finset.{u3} ι'} {g : ι -> ι'} {f : ι -> N}, (forall (y : ι'), (Not (Membership.mem.{u3, u3} ι' (Finset.{u3} ι') (Finset.instMembershipFinset.{u3} ι') y t)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x)) (OfNat.ofNat.{u2} N 1 (One.toOfNat1.{u2} N (Monoid.toOne.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)) (Finset.prod.{u2, u3} N ι' (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (y : ι') => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x))))
-Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one'ₓ'. -/
/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (y «expr ∉ » t) -/
@[to_additive sum_le_sum_fiberwise_of_sum_fiber_nonpos]
theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
@@ -361,45 +253,21 @@ theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι
end OrderedCommMonoid
-/- warning: finset.abs_sum_le_sum_abs -> Finset.abs_sum_le_sum_abs is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] (f : ι -> G) (s : Finset.{u1} ι), LE.le.{u2} G (Preorder.toHasLe.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (f i)))
-but is expected to have type
- forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] (f : ι -> G) (s : Finset.{u1} ι), LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (f i)))
-Case conversion may be inaccurate. Consider using '#align finset.abs_sum_le_sum_abs Finset.abs_sum_le_sum_absₓ'. -/
theorem abs_sum_le_sum_abs {G : Type _} [LinearOrderedAddCommGroup G] (f : ι → G) (s : Finset ι) :
|∑ i in s, f i| ≤ ∑ i in s, |f i| :=
le_sum_of_subadditive _ abs_zero abs_add s f
#align finset.abs_sum_le_sum_abs Finset.abs_sum_le_sum_abs
-/- warning: finset.abs_sum_of_nonneg -> Finset.abs_sum_of_nonneg is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} G (Preorder.toHasLe.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (OfNat.mk.{u2} G 0 (Zero.zero.{u2} G (AddZeroClass.toHasZero.{u2} G (AddMonoid.toAddZeroClass.{u2} G (SubNegMonoid.toAddMonoid.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))))))))) (f i))) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (Zero.toOfNat0.{u2} G (NegZeroClass.toZero.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))))) (f i))) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align finset.abs_sum_of_nonneg Finset.abs_sum_of_nonnegₓ'. -/
theorem abs_sum_of_nonneg {G : Type _} [LinearOrderedAddCommGroup G] {f : ι → G} {s : Finset ι}
(hf : ∀ i ∈ s, 0 ≤ f i) : |∑ i : ι in s, f i| = ∑ i : ι in s, f i := by
rw [abs_of_nonneg (Finset.sum_nonneg hf)]
#align finset.abs_sum_of_nonneg Finset.abs_sum_of_nonneg
-/- warning: finset.abs_sum_of_nonneg' -> Finset.abs_sum_of_nonneg' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} G (Preorder.toHasLe.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (OfNat.mk.{u2} G 0 (Zero.zero.{u2} G (AddZeroClass.toHasZero.{u2} G (AddMonoid.toAddZeroClass.{u2} G (SubNegMonoid.toAddMonoid.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))))))))) (f i)) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (Zero.toOfNat0.{u2} G (NegZeroClass.toZero.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))))) (f i)) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align finset.abs_sum_of_nonneg' Finset.abs_sum_of_nonneg'ₓ'. -/
theorem abs_sum_of_nonneg' {G : Type _} [LinearOrderedAddCommGroup G] {f : ι → G} {s : Finset ι}
(hf : ∀ i, 0 ≤ f i) : |∑ i : ι in s, f i| = ∑ i : ι in s, f i := by
rw [abs_of_nonneg (Finset.sum_nonneg' hf)]
#align finset.abs_sum_of_nonneg' Finset.abs_sum_of_nonneg'
-/- warning: finset.abs_prod -> Finset.abs_prod is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : LinearOrderedCommRing.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, Eq.{succ u2} R (Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (SubNegMonoid.toHasNeg.{u2} R (AddGroup.toSubNegMonoid.{u2} R (AddGroupWithOne.toAddGroup.{u2} R (AddCommGroupWithOne.toAddGroupWithOne.{u2} R (Ring.toAddCommGroupWithOne.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))))) (SemilatticeSup.toHasSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (LinearOrder.toLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => f x))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (SubNegMonoid.toHasNeg.{u2} R (AddGroup.toSubNegMonoid.{u2} R (AddGroupWithOne.toAddGroup.{u2} R (AddCommGroupWithOne.toAddGroupWithOne.{u2} R (Ring.toAddCommGroupWithOne.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))))) (SemilatticeSup.toHasSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (LinearOrder.toLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))) (f x)))
-but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : LinearOrderedCommRing.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, Eq.{succ u2} R (Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (Ring.toNeg.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))) (SemilatticeSup.toSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (DistribLattice.toLattice.{u2} R (instDistribLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1))))))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => f x))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (Ring.toNeg.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))) (SemilatticeSup.toSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (DistribLattice.toLattice.{u2} R (instDistribLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1))))))) (f x)))
-Case conversion may be inaccurate. Consider using '#align finset.abs_prod Finset.abs_prodₓ'. -/
theorem abs_prod {R : Type _} [LinearOrderedCommRing R] {f : ι → R} {s : Finset ι} :
|∏ x in s, f x| = ∏ x in s, |f x| :=
(absHom.toMonoidHom : R →* R).map_prod _ _
@@ -409,12 +277,6 @@ section Pigeonhole
variable [DecidableEq β]
-/- warning: finset.card_le_mul_card_image_of_maps_to -> Finset.card_le_mul_card_image_of_maps_to is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} β] {f : α -> β} {s : Finset.{u1} α} {t : Finset.{u2} β}, (forall (a : α), (Membership.Mem.{u1, u1} α (Finset.{u1} α) (Finset.hasMem.{u1} α) a s) -> (Membership.Mem.{u2, u2} β (Finset.{u2} β) (Finset.hasMem.{u2} β) (f a) t)) -> (forall (n : Nat), (forall (a : β), (Membership.Mem.{u2, u2} β (Finset.{u2} β) (Finset.hasMem.{u2} β) a t) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} α (Finset.filter.{u1} α (fun (x : α) => Eq.{succ u2} β (f x) a) (fun (a_1 : α) => _inst_1 (f a_1) a) s)) n)) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} α s) (HMul.hMul.{0, 0, 0} Nat Nat Nat (instHMul.{0} Nat Nat.hasMul) n (Finset.card.{u2} β t))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} β] {f : α -> β} {s : Finset.{u2} α} {t : Finset.{u1} β}, (forall (a : α), (Membership.mem.{u2, u2} α (Finset.{u2} α) (Finset.instMembershipFinset.{u2} α) a s) -> (Membership.mem.{u1, u1} β (Finset.{u1} β) (Finset.instMembershipFinset.{u1} β) (f a) t)) -> (forall (n : Nat), (forall (a : β), (Membership.mem.{u1, u1} β (Finset.{u1} β) (Finset.instMembershipFinset.{u1} β) a t) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} α (Finset.filter.{u2} α (fun (x : α) => Eq.{succ u1} β (f x) a) (fun (a_1 : α) => _inst_1 (f a_1) a) s)) n)) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} α s) (HMul.hMul.{0, 0, 0} Nat Nat Nat (instHMul.{0} Nat instMulNat) n (Finset.card.{u1} β t))))
-Case conversion may be inaccurate. Consider using '#align finset.card_le_mul_card_image_of_maps_to Finset.card_le_mul_card_image_of_maps_toₓ'. -/
theorem card_le_mul_card_image_of_maps_to {f : α → β} {s : Finset α} {t : Finset β}
(Hf : ∀ a ∈ s, f a ∈ t) (n : ℕ) (hn : ∀ a ∈ t, (s.filterₓ fun x => f x = a).card ≤ n) :
s.card ≤ n * t.card :=
@@ -425,23 +287,11 @@ theorem card_le_mul_card_image_of_maps_to {f : α → β} {s : Finset α} {t : F
#align finset.card_le_mul_card_image_of_maps_to Finset.card_le_mul_card_image_of_maps_to
-/- warning: finset.card_le_mul_card_image -> Finset.card_le_mul_card_image is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} β] {f : α -> β} (s : Finset.{u1} α) (n : Nat), (forall (a : β), (Membership.Mem.{u2, u2} β (Finset.{u2} β) (Finset.hasMem.{u2} β) a (Finset.image.{u1, u2} α β (fun (a : β) (b : β) => _inst_1 a b) f s)) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} α (Finset.filter.{u1} α (fun (x : α) => Eq.{succ u2} β (f x) a) (fun (a_1 : α) => _inst_1 (f a_1) a) s)) n)) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} α s) (HMul.hMul.{0, 0, 0} Nat Nat Nat (instHMul.{0} Nat Nat.hasMul) n (Finset.card.{u2} β (Finset.image.{u1, u2} α β (fun (a : β) (b : β) => _inst_1 a b) f s))))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} β] {f : α -> β} (s : Finset.{u2} α) (n : Nat), (forall (a : β), (Membership.mem.{u1, u1} β (Finset.{u1} β) (Finset.instMembershipFinset.{u1} β) a (Finset.image.{u2, u1} α β (fun (a : β) (b : β) => _inst_1 a b) f s)) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} α (Finset.filter.{u2} α (fun (x : α) => Eq.{succ u1} β (f x) a) (fun (a_1 : α) => _inst_1 (f a_1) a) s)) n)) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} α s) (HMul.hMul.{0, 0, 0} Nat Nat Nat (instHMul.{0} Nat instMulNat) n (Finset.card.{u1} β (Finset.image.{u2, u1} α β (fun (a : β) (b : β) => _inst_1 a b) f s))))
-Case conversion may be inaccurate. Consider using '#align finset.card_le_mul_card_image Finset.card_le_mul_card_imageₓ'. -/
theorem card_le_mul_card_image {f : α → β} (s : Finset α) (n : ℕ)
(hn : ∀ a ∈ s.image f, (s.filterₓ fun x => f x = a).card ≤ n) : s.card ≤ n * (s.image f).card :=
card_le_mul_card_image_of_maps_to (fun x => mem_image_of_mem _) n hn
#align finset.card_le_mul_card_image Finset.card_le_mul_card_image
-/- warning: finset.mul_card_image_le_card_of_maps_to -> Finset.mul_card_image_le_card_of_maps_to is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} β] {f : α -> β} {s : Finset.{u1} α} {t : Finset.{u2} β}, (forall (a : α), (Membership.Mem.{u1, u1} α (Finset.{u1} α) (Finset.hasMem.{u1} α) a s) -> (Membership.Mem.{u2, u2} β (Finset.{u2} β) (Finset.hasMem.{u2} β) (f a) t)) -> (forall (n : Nat), (forall (a : β), (Membership.Mem.{u2, u2} β (Finset.{u2} β) (Finset.hasMem.{u2} β) a t) -> (LE.le.{0} Nat Nat.hasLe n (Finset.card.{u1} α (Finset.filter.{u1} α (fun (x : α) => Eq.{succ u2} β (f x) a) (fun (a_1 : α) => _inst_1 (f a_1) a) s)))) -> (LE.le.{0} Nat Nat.hasLe (HMul.hMul.{0, 0, 0} Nat Nat Nat (instHMul.{0} Nat Nat.hasMul) n (Finset.card.{u2} β t)) (Finset.card.{u1} α s)))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} β] {f : α -> β} {s : Finset.{u2} α} {t : Finset.{u1} β}, (forall (a : α), (Membership.mem.{u2, u2} α (Finset.{u2} α) (Finset.instMembershipFinset.{u2} α) a s) -> (Membership.mem.{u1, u1} β (Finset.{u1} β) (Finset.instMembershipFinset.{u1} β) (f a) t)) -> (forall (n : Nat), (forall (a : β), (Membership.mem.{u1, u1} β (Finset.{u1} β) (Finset.instMembershipFinset.{u1} β) a t) -> (LE.le.{0} Nat instLENat n (Finset.card.{u2} α (Finset.filter.{u2} α (fun (x : α) => Eq.{succ u1} β (f x) a) (fun (a_1 : α) => _inst_1 (f a_1) a) s)))) -> (LE.le.{0} Nat instLENat (HMul.hMul.{0, 0, 0} Nat Nat Nat (instHMul.{0} Nat instMulNat) n (Finset.card.{u1} β t)) (Finset.card.{u2} α s)))
-Case conversion may be inaccurate. Consider using '#align finset.mul_card_image_le_card_of_maps_to Finset.mul_card_image_le_card_of_maps_toₓ'. -/
theorem mul_card_image_le_card_of_maps_to {f : α → β} {s : Finset α} {t : Finset β}
(Hf : ∀ a ∈ s, f a ∈ t) (n : ℕ) (hn : ∀ a ∈ t, n ≤ (s.filterₓ fun x => f x = a).card) :
n * t.card ≤ s.card :=
@@ -452,12 +302,6 @@ theorem mul_card_image_le_card_of_maps_to {f : α → β} {s : Finset α} {t : F
#align finset.mul_card_image_le_card_of_maps_to Finset.mul_card_image_le_card_of_maps_to
-/- warning: finset.mul_card_image_le_card -> Finset.mul_card_image_le_card is a dubious translation:
-lean 3 declaration is
- forall {α : Type.{u1}} {β : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} β] {f : α -> β} (s : Finset.{u1} α) (n : Nat), (forall (a : β), (Membership.Mem.{u2, u2} β (Finset.{u2} β) (Finset.hasMem.{u2} β) a (Finset.image.{u1, u2} α β (fun (a : β) (b : β) => _inst_1 a b) f s)) -> (LE.le.{0} Nat Nat.hasLe n (Finset.card.{u1} α (Finset.filter.{u1} α (fun (x : α) => Eq.{succ u2} β (f x) a) (fun (a_1 : α) => _inst_1 (f a_1) a) s)))) -> (LE.le.{0} Nat Nat.hasLe (HMul.hMul.{0, 0, 0} Nat Nat Nat (instHMul.{0} Nat Nat.hasMul) n (Finset.card.{u2} β (Finset.image.{u1, u2} α β (fun (a : β) (b : β) => _inst_1 a b) f s))) (Finset.card.{u1} α s))
-but is expected to have type
- forall {α : Type.{u2}} {β : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} β] {f : α -> β} (s : Finset.{u2} α) (n : Nat), (forall (a : β), (Membership.mem.{u1, u1} β (Finset.{u1} β) (Finset.instMembershipFinset.{u1} β) a (Finset.image.{u2, u1} α β (fun (a : β) (b : β) => _inst_1 a b) f s)) -> (LE.le.{0} Nat instLENat n (Finset.card.{u2} α (Finset.filter.{u2} α (fun (x : α) => Eq.{succ u1} β (f x) a) (fun (a_1 : α) => _inst_1 (f a_1) a) s)))) -> (LE.le.{0} Nat instLENat (HMul.hMul.{0, 0, 0} Nat Nat Nat (instHMul.{0} Nat instMulNat) n (Finset.card.{u1} β (Finset.image.{u2, u1} α β (fun (a : β) (b : β) => _inst_1 a b) f s))) (Finset.card.{u2} α s))
-Case conversion may be inaccurate. Consider using '#align finset.mul_card_image_le_card Finset.mul_card_image_le_cardₓ'. -/
theorem mul_card_image_le_card {f : α → β} (s : Finset α) (n : ℕ)
(hn : ∀ a ∈ s.image f, n ≤ (s.filterₓ fun x => f x = a).card) : n * (s.image f).card ≤ s.card :=
mul_card_image_le_card_of_maps_to (fun x => mem_image_of_mem _) n hn
@@ -535,23 +379,11 @@ theorem sum_card [Fintype α] (h : ∀ a, (B.filterₓ <| (· ∈ ·) a).card =
#align finset.sum_card Finset.sum_card
-/
-/- warning: finset.card_le_card_bUnion -> Finset.card_le_card_biUnion is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} α] {s : Finset.{u1} ι} {f : ι -> (Finset.{u2} α)}, (Set.PairwiseDisjoint.{u2, u1} (Finset.{u2} α) ι (Finset.partialOrder.{u2} α) (Finset.orderBot.{u2} α) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Finset.{u1} ι) (Set.{u1} ι) (HasLiftT.mk.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (CoeTCₓ.coe.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (Finset.Set.hasCoeT.{u1} ι))) s) f) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Finset.Nonempty.{u2} α (f i))) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} ι s) (Finset.card.{u2} α (Finset.biUnion.{u1, u2} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)))
-but is expected to have type
- forall {ι : Type.{u2}} {α : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} α] {s : Finset.{u2} ι} {f : ι -> (Finset.{u1} α)}, (Set.PairwiseDisjoint.{u1, u2} (Finset.{u1} α) ι (Finset.partialOrder.{u1} α) (Finset.instOrderBotFinsetToLEToPreorderPartialOrder.{u1} α) (Finset.toSet.{u2} ι s) f) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (Finset.Nonempty.{u1} α (f i))) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} ι s) (Finset.card.{u1} α (Finset.biUnion.{u2, u1} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)))
-Case conversion may be inaccurate. Consider using '#align finset.card_le_card_bUnion Finset.card_le_card_biUnionₓ'. -/
theorem card_le_card_biUnion {s : Finset ι} {f : ι → Finset α} (hs : (s : Set ι).PairwiseDisjoint f)
(hf : ∀ i ∈ s, (f i).Nonempty) : s.card ≤ (s.biUnion f).card := by
rw [card_bUnion hs, card_eq_sum_ones]; exact sum_le_sum fun i hi => (hf i hi).card_pos
#align finset.card_le_card_bUnion Finset.card_le_card_biUnion
-/- warning: finset.card_le_card_bUnion_add_card_fiber -> Finset.card_le_card_biUnion_add_card_fiber is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} α] {s : Finset.{u1} ι} {f : ι -> (Finset.{u2} α)}, (Set.PairwiseDisjoint.{u2, u1} (Finset.{u2} α) ι (Finset.partialOrder.{u2} α) (Finset.orderBot.{u2} α) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Finset.{u1} ι) (Set.{u1} ι) (HasLiftT.mk.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (CoeTCₓ.coe.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (Finset.Set.hasCoeT.{u1} ι))) s) f) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} ι s) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat Nat.hasAdd) (Finset.card.{u2} α (Finset.biUnion.{u1, u2} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)) (Finset.card.{u1} ι (Finset.filter.{u1} ι (fun (i : ι) => Eq.{succ u2} (Finset.{u2} α) (f i) (EmptyCollection.emptyCollection.{u2} (Finset.{u2} α) (Finset.hasEmptyc.{u2} α))) (fun (a : ι) => Finset.decidableEq.{u2} α (fun (a : α) (b : α) => _inst_1 a b) (f a) (EmptyCollection.emptyCollection.{u2} (Finset.{u2} α) (Finset.hasEmptyc.{u2} α))) s))))
-but is expected to have type
- forall {ι : Type.{u2}} {α : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} α] {s : Finset.{u2} ι} {f : ι -> (Finset.{u1} α)}, (Set.PairwiseDisjoint.{u1, u2} (Finset.{u1} α) ι (Finset.partialOrder.{u1} α) (Finset.instOrderBotFinsetToLEToPreorderPartialOrder.{u1} α) (Finset.toSet.{u2} ι s) f) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} ι s) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat instAddNat) (Finset.card.{u1} α (Finset.biUnion.{u2, u1} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)) (Finset.card.{u2} ι (Finset.filter.{u2} ι (fun (i : ι) => Eq.{succ u1} (Finset.{u1} α) (f i) (EmptyCollection.emptyCollection.{u1} (Finset.{u1} α) (Finset.instEmptyCollectionFinset.{u1} α))) (fun (a : ι) => Finset.decidableEq.{u1} α (fun (a : α) (b : α) => _inst_1 a b) (f a) (EmptyCollection.emptyCollection.{u1} (Finset.{u1} α) (Finset.instEmptyCollectionFinset.{u1} α))) s))))
-Case conversion may be inaccurate. Consider using '#align finset.card_le_card_bUnion_add_card_fiber Finset.card_le_card_biUnion_add_card_fiberₓ'. -/
theorem card_le_card_biUnion_add_card_fiber {s : Finset ι} {f : ι → Finset α}
(hs : (s : Set ι).PairwiseDisjoint f) :
s.card ≤ (s.biUnion f).card + (s.filterₓ fun i => f i = ∅).card :=
@@ -565,12 +397,6 @@ theorem card_le_card_biUnion_add_card_fiber {s : Finset ι} {f : ι → Finset
_
#align finset.card_le_card_bUnion_add_card_fiber Finset.card_le_card_biUnion_add_card_fiber
-/- warning: finset.card_le_card_bUnion_add_one -> Finset.card_le_card_biUnion_add_one is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} α] {s : Finset.{u1} ι} {f : ι -> (Finset.{u2} α)}, (Function.Injective.{succ u1, succ u2} ι (Finset.{u2} α) f) -> (Set.PairwiseDisjoint.{u2, u1} (Finset.{u2} α) ι (Finset.partialOrder.{u2} α) (Finset.orderBot.{u2} α) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Finset.{u1} ι) (Set.{u1} ι) (HasLiftT.mk.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (CoeTCₓ.coe.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (Finset.Set.hasCoeT.{u1} ι))) s) f) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} ι s) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat Nat.hasAdd) (Finset.card.{u2} α (Finset.biUnion.{u1, u2} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)) (OfNat.ofNat.{0} Nat 1 (OfNat.mk.{0} Nat 1 (One.one.{0} Nat Nat.hasOne)))))
-but is expected to have type
- forall {ι : Type.{u2}} {α : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} α] {s : Finset.{u2} ι} {f : ι -> (Finset.{u1} α)}, (Function.Injective.{succ u2, succ u1} ι (Finset.{u1} α) f) -> (Set.PairwiseDisjoint.{u1, u2} (Finset.{u1} α) ι (Finset.partialOrder.{u1} α) (Finset.instOrderBotFinsetToLEToPreorderPartialOrder.{u1} α) (Finset.toSet.{u2} ι s) f) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} ι s) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat instAddNat) (Finset.card.{u1} α (Finset.biUnion.{u2, u1} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)) (OfNat.ofNat.{0} Nat 1 (instOfNatNat 1))))
-Case conversion may be inaccurate. Consider using '#align finset.card_le_card_bUnion_add_one Finset.card_le_card_biUnion_add_oneₓ'. -/
theorem card_le_card_biUnion_add_one {s : Finset ι} {f : ι → Finset α} (hf : Injective f)
(hs : (s : Set ι).PairwiseDisjoint f) : s.card ≤ (s.biUnion f).card + 1 :=
(card_le_card_biUnion_add_card_fiber hs).trans <|
@@ -584,48 +410,24 @@ section CanonicallyOrderedMonoid
variable [CanonicallyOrderedMonoid M] {f : ι → M} {s t : Finset ι}
-/- warning: finset.prod_eq_one_iff' -> Finset.prod_eq_one_iff' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : CanonicallyOrderedMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, Iff (Eq.{succ u2} M (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) s (fun (x : ι) => f x)) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1))))))))) (forall (x : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x s) -> (Eq.{succ u2} M (f x) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1))))))))))
-but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : CanonicallyOrderedMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, Iff (Eq.{succ u2} M (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) s (fun (x : ι) => f x)) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M (CommMonoid.toMonoid.{u2} M (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1))))))) (forall (x : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) x s) -> (Eq.{succ u2} M (f x) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M (CommMonoid.toMonoid.{u2} M (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1))))))))
-Case conversion may be inaccurate. Consider using '#align finset.prod_eq_one_iff' Finset.prod_eq_one_iff'ₓ'. -/
@[simp, to_additive sum_eq_zero_iff]
theorem prod_eq_one_iff' : (∏ x in s, f x) = 1 ↔ ∀ x ∈ s, f x = 1 :=
prod_eq_one_iff_of_one_le' fun x hx => one_le (f x)
#align finset.prod_eq_one_iff' Finset.prod_eq_one_iff'
#align finset.sum_eq_zero_iff Finset.sum_eq_zero_iff
-/- warning: finset.prod_le_prod_of_subset' -> Finset.prod_le_prod_of_subset' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : CanonicallyOrderedMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι} {t : Finset.{u1} ι}, (HasSubset.Subset.{u1} (Finset.{u1} ι) (Finset.hasSubset.{u1} ι) s t) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCommMonoid.toPartialOrder.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) s (fun (x : ι) => f x)) (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) t (fun (x : ι) => f x)))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : CanonicallyOrderedMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι} {t : Finset.{u2} ι}, (HasSubset.Subset.{u2} (Finset.{u2} ι) (Finset.instHasSubsetFinset.{u2} ι) s t) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCommMonoid.toPartialOrder.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)))) (Finset.prod.{u1, u2} M ι (OrderedCommMonoid.toCommMonoid.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)) s (fun (x : ι) => f x)) (Finset.prod.{u1, u2} M ι (OrderedCommMonoid.toCommMonoid.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)) t (fun (x : ι) => f x)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod_of_subset' Finset.prod_le_prod_of_subset'ₓ'. -/
@[to_additive sum_le_sum_of_subset]
theorem prod_le_prod_of_subset' (h : s ⊆ t) : (∏ x in s, f x) ≤ ∏ x in t, f x :=
prod_le_prod_of_subset_of_one_le' h fun x h₁ h₂ => one_le _
#align finset.prod_le_prod_of_subset' Finset.prod_le_prod_of_subset'
#align finset.sum_le_sum_of_subset Finset.sum_le_sum_of_subset
-/- warning: finset.prod_mono_set' -> Finset.prod_mono_set' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : CanonicallyOrderedMonoid.{u2} M] (f : ι -> M), Monotone.{u1, u2} (Finset.{u1} ι) M (PartialOrder.toPreorder.{u1} (Finset.{u1} ι) (Finset.partialOrder.{u1} ι)) (PartialOrder.toPreorder.{u2} M (OrderedCommMonoid.toPartialOrder.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1))) (fun (s : Finset.{u1} ι) => Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) s (fun (x : ι) => f x))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : CanonicallyOrderedMonoid.{u1} M] (f : ι -> M), Monotone.{u2, u1} (Finset.{u2} ι) M (PartialOrder.toPreorder.{u2} (Finset.{u2} ι) (Finset.partialOrder.{u2} ι)) (PartialOrder.toPreorder.{u1} M (OrderedCommMonoid.toPartialOrder.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1))) (fun (s : Finset.{u2} ι) => Finset.prod.{u1, u2} M ι (OrderedCommMonoid.toCommMonoid.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)) s (fun (x : ι) => f x))
-Case conversion may be inaccurate. Consider using '#align finset.prod_mono_set' Finset.prod_mono_set'ₓ'. -/
@[to_additive sum_mono_set]
theorem prod_mono_set' (f : ι → M) : Monotone fun s => ∏ x in s, f x := fun s₁ s₂ hs =>
prod_le_prod_of_subset' hs
#align finset.prod_mono_set' Finset.prod_mono_set'
#align finset.sum_mono_set Finset.sum_mono_set
-/- warning: finset.prod_le_prod_of_ne_one' -> Finset.prod_le_prod_of_ne_one' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : CanonicallyOrderedMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι} {t : Finset.{u1} ι}, (forall (x : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x s) -> (Ne.{succ u2} M (f x) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1))))))))) -> (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x t)) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCommMonoid.toPartialOrder.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) s (fun (x : ι) => f x)) (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) t (fun (x : ι) => f x)))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : CanonicallyOrderedMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι} {t : Finset.{u2} ι}, (forall (x : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) x s) -> (Ne.{succ u1} M (f x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M (CommMonoid.toMonoid.{u1} M (OrderedCommMonoid.toCommMonoid.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1))))))) -> (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) x t)) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCommMonoid.toPartialOrder.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)))) (Finset.prod.{u1, u2} M ι (OrderedCommMonoid.toCommMonoid.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)) s (fun (x : ι) => f x)) (Finset.prod.{u1, u2} M ι (OrderedCommMonoid.toCommMonoid.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)) t (fun (x : ι) => f x)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod_of_ne_one' Finset.prod_le_prod_of_ne_one'ₓ'. -/
@[to_additive sum_le_sum_of_ne_zero]
theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : (∏ x in s, f x) ≤ ∏ x in t, f x :=
by
@@ -649,12 +451,6 @@ section OrderedCancelCommMonoid
variable [OrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
-/- warning: finset.prod_lt_prod' -> Finset.prod_lt_prod' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (g i))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (g i)))) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => g i)))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (g i))) -> (Exists.{succ u2} ι (fun (i : ι) => And (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (g i)))) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => g i)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_lt_prod' Finset.prod_lt_prod'ₓ'. -/
@[to_additive sum_lt_sum]
theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i < g i) :
(∏ i in s, f i) < ∏ i in s, g i := by
@@ -665,12 +461,6 @@ theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i <
#align finset.prod_lt_prod' Finset.prod_lt_prod'
#align finset.sum_lt_sum Finset.sum_lt_sum
-/- warning: finset.prod_lt_prod_of_nonempty' -> Finset.prod_lt_prod_of_nonempty' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (Finset.Nonempty.{u1} ι s) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (g i))) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => g i)))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u2} ι}, (Finset.Nonempty.{u2} ι s) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (g i))) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => g i)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_lt_prod_of_nonempty' Finset.prod_lt_prod_of_nonempty'ₓ'. -/
@[to_additive sum_lt_sum_of_nonempty]
theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g i) :
(∏ i in s, f i) < ∏ i in s, g i := by
@@ -681,12 +471,6 @@ theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g
#align finset.prod_lt_prod_of_nonempty' Finset.prod_lt_prod_of_nonempty'
#align finset.sum_lt_sum_of_nonempty Finset.sum_lt_sum_of_nonempty
-/- warning: finset.prod_lt_prod_of_subset' -> Finset.prod_lt_prod_of_subset' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι} {t : Finset.{u1} ι}, (HasSubset.Subset.{u1} (Finset.{u1} ι) (Finset.hasSubset.{u1} ι) s t) -> (forall {i : ι}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i t) -> (Not (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s)) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f i)) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j t) -> (Not (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s)) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f j))) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (j : ι) => f j)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) t (fun (j : ι) => f j))))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι} {t : Finset.{u2} ι}, (HasSubset.Subset.{u2} (Finset.{u2} ι) (Finset.instHasSubsetFinset.{u2} ι) s t) -> (forall {i : ι}, (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i t) -> (Not (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s)) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f i)) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j t) -> (Not (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s)) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f j))) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (j : ι) => f j)) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) t (fun (j : ι) => f j))))
-Case conversion may be inaccurate. Consider using '#align finset.prod_lt_prod_of_subset' Finset.prod_lt_prod_of_subset'ₓ'. -/
@[to_additive sum_lt_sum_of_subset]
theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i ∉ s) (hlt : 1 < f i)
(hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : (∏ j in s, f j) < ∏ j in t, f j := by
@@ -705,12 +489,6 @@ theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i
#align finset.prod_lt_prod_of_subset' Finset.prod_lt_prod_of_subset'
#align finset.sum_lt_sum_of_subset Finset.sum_lt_sum_of_subset
-/- warning: finset.single_lt_prod' -> Finset.single_lt_prod' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι} {i : ι} {j : ι}, (Ne.{succ u1} ι j i) -> (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f j)) -> (forall (k : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) k s) -> (Ne.{succ u1} ι k i) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f k))) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (k : ι) => f k)))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι} {i : ι} {j : ι}, (Ne.{succ u2} ι j i) -> (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f j)) -> (forall (k : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) k s) -> (Ne.{succ u2} ι k i) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f k))) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (k : ι) => f k)))
-Case conversion may be inaccurate. Consider using '#align finset.single_lt_prod' Finset.single_lt_prod'ₓ'. -/
@[to_additive single_lt_sum]
theorem single_lt_prod' {i j : ι} (hij : j ≠ i) (hi : i ∈ s) (hj : j ∈ s) (hlt : 1 < f j)
(hle : ∀ k ∈ s, k ≠ i → 1 ≤ f k) : f i < ∏ k in s, f k :=
@@ -723,60 +501,30 @@ theorem single_lt_prod' {i j : ι} (hij : j ≠ i) (hi : i ∈ s) (hj : j ∈ s)
#align finset.single_lt_prod' Finset.single_lt_prod'
#align finset.single_lt_sum Finset.single_lt_sum
-/- warning: finset.one_lt_prod -> Finset.one_lt_prod is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f i))) -> (Finset.Nonempty.{u1} ι s) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f i))) -> (Finset.Nonempty.{u2} ι s) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align finset.one_lt_prod Finset.one_lt_prodₓ'. -/
@[to_additive sum_pos]
theorem one_lt_prod (h : ∀ i ∈ s, 1 < f i) (hs : s.Nonempty) : 1 < ∏ i in s, f i :=
lt_of_le_of_lt (by rw [prod_const_one]) <| prod_lt_prod_of_nonempty' hs h
#align finset.one_lt_prod Finset.one_lt_prod
#align finset.sum_pos Finset.sum_pos
-/- warning: finset.prod_lt_one -> Finset.prod_lt_one is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))))) -> (Finset.Nonempty.{u1} ι s) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))))) -> (Finset.Nonempty.{u2} ι s) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))))
-Case conversion may be inaccurate. Consider using '#align finset.prod_lt_one Finset.prod_lt_oneₓ'. -/
@[to_additive]
theorem prod_lt_one (h : ∀ i ∈ s, f i < 1) (hs : s.Nonempty) : (∏ i in s, f i) < 1 :=
(prod_lt_prod_of_nonempty' hs h).trans_le (by rw [prod_const_one])
#align finset.prod_lt_one Finset.prod_lt_one
#align finset.sum_neg Finset.sum_neg
-/- warning: finset.one_lt_prod' -> Finset.one_lt_prod' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f i))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f i)))) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f i))) -> (Exists.{succ u2} ι (fun (i : ι) => And (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f i)))) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align finset.one_lt_prod' Finset.one_lt_prod'ₓ'. -/
@[to_additive sum_pos']
theorem one_lt_prod' (h : ∀ i ∈ s, 1 ≤ f i) (hs : ∃ i ∈ s, 1 < f i) : 1 < ∏ i in s, f i :=
prod_const_one.symm.trans_lt <| prod_lt_prod' h hs
#align finset.one_lt_prod' Finset.one_lt_prod'
#align finset.sum_pos' Finset.sum_pos'
-/- warning: finset.prod_lt_one' -> Finset.prod_lt_one' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1)))))))))))) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))))) -> (Exists.{succ u2} ι (fun (i : ι) => And (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1))))))))) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))))
-Case conversion may be inaccurate. Consider using '#align finset.prod_lt_one' Finset.prod_lt_one'ₓ'. -/
@[to_additive]
theorem prod_lt_one' (h : ∀ i ∈ s, f i ≤ 1) (hs : ∃ i ∈ s, f i < 1) : (∏ i in s, f i) < 1 :=
prod_const_one.le.trans_lt' <| prod_lt_prod' h hs
#align finset.prod_lt_one' Finset.prod_lt_one'
#align finset.sum_neg' Finset.sum_neg'
-/- warning: finset.prod_eq_prod_iff_of_le -> Finset.prod_eq_prod_iff_of_le is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {s : Finset.{u1} ι} {f : ι -> M} {g : ι -> M}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (g i))) -> (Iff (Eq.{succ u2} M (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => g i))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Eq.{succ u2} M (f i) (g i))))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {s : Finset.{u2} ι} {f : ι -> M} {g : ι -> M}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (g i))) -> (Iff (Eq.{succ u1} M (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => g i))) (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (Eq.{succ u1} M (f i) (g i))))
-Case conversion may be inaccurate. Consider using '#align finset.prod_eq_prod_iff_of_le Finset.prod_eq_prod_iff_of_leₓ'. -/
@[to_additive]
theorem prod_eq_prod_iff_of_le {f g : ι → M} (h : ∀ i ∈ s, f i ≤ g i) :
((∏ i in s, f i) = ∏ i in s, g i) ↔ ∀ i ∈ s, f i = g i := by
@@ -798,12 +546,6 @@ section LinearOrderedCancelCommMonoid
variable [LinearOrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
-/- warning: finset.exists_lt_of_prod_lt' -> Finset.exists_lt_of_prod_lt' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => g i))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (f i) (g i))))
-but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => g i))) -> (Exists.{succ u1} ι (fun (i : ι) => And (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (f i) (g i))))
-Case conversion may be inaccurate. Consider using '#align finset.exists_lt_of_prod_lt' Finset.exists_lt_of_prod_lt'ₓ'. -/
@[to_additive exists_lt_of_sum_lt]
theorem exists_lt_of_prod_lt' (Hlt : (∏ i in s, f i) < ∏ i in s, g i) : ∃ i ∈ s, f i < g i :=
by
@@ -812,12 +554,6 @@ theorem exists_lt_of_prod_lt' (Hlt : (∏ i in s, f i) < ∏ i in s, g i) : ∃
#align finset.exists_lt_of_prod_lt' Finset.exists_lt_of_prod_lt'
#align finset.exists_lt_of_sum_lt Finset.exists_lt_of_sum_lt
-/- warning: finset.exists_le_of_prod_le' -> Finset.exists_le_of_prod_le' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (Finset.Nonempty.{u1} ι s) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => g i))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (f i) (g i))))
-but is expected to have type
- forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : LinearOrderedCancelCommMonoid.{u1} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u2} ι}, (Finset.Nonempty.{u2} ι s) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u1} M _inst_1)))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u1} M _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u1} M _inst_1)) s (fun (i : ι) => g i))) -> (Exists.{succ u2} ι (fun (i : ι) => And (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u1} M _inst_1)))) (f i) (g i))))
-Case conversion may be inaccurate. Consider using '#align finset.exists_le_of_prod_le' Finset.exists_le_of_prod_le'ₓ'. -/
@[to_additive exists_le_of_sum_le]
theorem exists_le_of_prod_le' (hs : s.Nonempty) (Hle : (∏ i in s, f i) ≤ ∏ i in s, g i) :
∃ i ∈ s, f i ≤ g i := by
@@ -826,12 +562,6 @@ theorem exists_le_of_prod_le' (hs : s.Nonempty) (Hle : (∏ i in s, f i) ≤ ∏
#align finset.exists_le_of_prod_le' Finset.exists_le_of_prod_le'
#align finset.exists_le_of_sum_le Finset.exists_le_of_sum_le
-/- warning: finset.exists_one_lt_of_prod_one_of_exists_ne_one' -> Finset.exists_one_lt_of_prod_one_of_exists_ne_one' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {s : Finset.{u1} ι} (f : ι -> M), (Eq.{succ u2} M (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1))))))))))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => Ne.{succ u2} M (f i) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1))))))))))))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))))))))) (f i))))
-but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {s : Finset.{u1} ι} (f : ι -> M), (Eq.{succ u2} M (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (RightCancelMonoid.toOne.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))))))) -> (Exists.{succ u1} ι (fun (i : ι) => And (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) (Ne.{succ u2} M (f i) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (RightCancelMonoid.toOne.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))))))))) -> (Exists.{succ u1} ι (fun (i : ι) => And (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (RightCancelMonoid.toOne.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1))))))) (f i))))
-Case conversion may be inaccurate. Consider using '#align finset.exists_one_lt_of_prod_one_of_exists_ne_one' Finset.exists_one_lt_of_prod_one_of_exists_ne_one'ₓ'. -/
@[to_additive exists_pos_of_sum_zero_of_exists_nonzero]
theorem exists_one_lt_of_prod_one_of_exists_ne_one' (f : ι → M) (h₁ : (∏ i in s, f i) = 1)
(h₂ : ∃ i ∈ s, f i ≠ 1) : ∃ i ∈ s, 1 < f i :=
@@ -854,23 +584,11 @@ variable [OrderedCommSemiring R] {f g : ι → R} {s t : Finset ι}
open Classical
-/- warning: finset.prod_nonneg -> Finset.prod_nonneg is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : OrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (f i))) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : OrderedCommSemiring.{u1} R] {f : ι -> R} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (f i))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_nonneg Finset.prod_nonnegₓ'. -/
-- this is also true for a ordered commutative multiplicative monoid with zero
theorem prod_nonneg (h0 : ∀ i ∈ s, 0 ≤ f i) : 0 ≤ ∏ i in s, f i :=
prod_induction f (fun i => 0 ≤ i) (fun _ _ ha hb => mul_nonneg ha hb) zero_le_one h0
#align finset.prod_nonneg Finset.prod_nonneg
-/- warning: finset.prod_le_prod -> Finset.prod_le_prod is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : OrderedCommSemiring.{u2} R] {f : ι -> R} {g : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (f i))) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (f i) (g i))) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => g i)))
-but is expected to have type
- forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : OrderedCommSemiring.{u1} R] {f : ι -> R} {g : ι -> R} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (f i))) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (f i) (g i))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => g i)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod Finset.prod_le_prodₓ'. -/
/-- If all `f i`, `i ∈ s`, are nonnegative and each `f i` is less than or equal to `g i`, then the
product of `f i` is less than or equal to the product of `g i`. See also `finset.prod_le_prod'` for
the case of an ordered commutative multiplicative monoid. -/
@@ -886,12 +604,6 @@ theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g
· apply le_trans (h0 a (mem_insert_self a s)) (h1 a (mem_insert_self a s))
#align finset.prod_le_prod Finset.prod_le_prod
-/- warning: finset.prod_le_one -> Finset.prod_le_one is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : OrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (f i))) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (f i) (OfNat.ofNat.{u2} R 1 (OfNat.mk.{u2} R 1 (One.one.{u2} R (AddMonoidWithOne.toOne.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))))) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} R 1 (OfNat.mk.{u2} R 1 (One.one.{u2} R (AddMonoidWithOne.toOne.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))))
-but is expected to have type
- forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : OrderedCommSemiring.{u1} R] {f : ι -> R} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (f i))) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (f i) (OfNat.ofNat.{u1} R 1 (One.toOfNat1.{u1} R (Semiring.toOne.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1))))))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)) (OfNat.ofNat.{u1} R 1 (One.toOfNat1.{u1} R (Semiring.toOne.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1))))))
-Case conversion may be inaccurate. Consider using '#align finset.prod_le_one Finset.prod_le_oneₓ'. -/
/-- If each `f i`, `i ∈ s` belongs to `[0, 1]`, then their product is less than or equal to one.
See also `finset.prod_le_one'` for the case of an ordered commutative multiplicative monoid. -/
theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 :=
@@ -900,12 +612,6 @@ theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1)
exact Finset.prod_const_one
#align finset.prod_le_one Finset.prod_le_one
-/- warning: finset.prod_add_prod_le -> Finset.prod_add_prod_le is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : OrderedCommSemiring.{u2} R] {s : Finset.{u1} ι} {i : ι} {f : ι -> R} {g : ι -> R} {h : ι -> R}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (g j) (f j))) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (h j) (f j))) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (g i))) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (h i))) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : OrderedCommSemiring.{u1} R] {s : Finset.{u2} ι} {i : ι} {f : ι -> R} {g : ι -> R} {h : ι -> R}, (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (g j) (f j))) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (h j) (f j))) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (g i))) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (h i))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1))))))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_add_prod_le Finset.prod_add_prod_leₓ'. -/
/-- If `g, h ≤ f` and `g i + h i ≤ f i`, then the product of `f` over `s` is at least the
sum of the products of `g` and `h`. This is the version for `ordered_comm_semiring`. -/
theorem prod_add_prod_le {i : ι} {f g h : ι → R} (hi : i ∈ s) (h2i : g i + h i ≤ f i)
@@ -928,12 +634,6 @@ section StrictOrderedCommSemiring
variable [StrictOrderedCommSemiring R] [Nontrivial R] {f : ι → R} {s : Finset ι}
-/- warning: finset.prod_pos -> Finset.prod_pos is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : StrictOrderedCommSemiring.{u2} R] [_inst_2 : Nontrivial.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toHasLt.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedCancelAddCommMonoid.toPartialOrder.{u2} R (StrictOrderedSemiring.toOrderedCancelAddCommMonoid.{u2} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (StrictOrderedSemiring.toSemiring.{u2} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u2} R _inst_1))))))))) (f i))) -> (LT.lt.{u2} R (Preorder.toHasLt.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedCancelAddCommMonoid.toPartialOrder.{u2} R (StrictOrderedSemiring.toOrderedCancelAddCommMonoid.{u2} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (StrictOrderedSemiring.toSemiring.{u2} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u2} R _inst_1))))))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (StrictOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : StrictOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {f : ι -> R} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (StrictOrderedSemiring.toPartialOrder.{u1} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (StrictOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (f i))) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (StrictOrderedSemiring.toPartialOrder.{u1} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (StrictOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (StrictOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_pos Finset.prod_posₓ'. -/
-- This is also true for a ordered commutative multiplicative monoid with zero
theorem prod_pos (h0 : ∀ i ∈ s, 0 < f i) : 0 < ∏ i in s, f i :=
prod_induction f (fun x => 0 < x) (fun _ _ ha hb => mul_pos ha hb) zero_lt_one h0
@@ -945,12 +645,6 @@ section CanonicallyOrderedCommSemiring
variable [CanonicallyOrderedCommSemiring R] {f g h : ι → R} {s : Finset ι} {i : ι}
-/- warning: canonically_ordered_comm_semiring.multiset_prod_pos -> CanonicallyOrderedCommSemiring.multiset_prod_pos is a dubious translation:
-lean 3 declaration is
- forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toHasLt.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) (Multiset.prod.{u1} R (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) m)) (forall (x : R), (Membership.Mem.{u1, u1} R (Multiset.{u1} R) (Multiset.hasMem.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toHasLt.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) x))
-but is expected to have type
- forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (Multiset.prod.{u1} R (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) m)) (forall (x : R), (Membership.mem.{u1, u1} R (Multiset.{u1} R) (Multiset.instMembershipMultiset.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) x))
-Case conversion may be inaccurate. Consider using '#align canonically_ordered_comm_semiring.multiset_prod_pos CanonicallyOrderedCommSemiring.multiset_prod_posₓ'. -/
@[simp]
theorem CanonicallyOrderedCommSemiring.multiset_prod_pos [Nontrivial R] {m : Multiset R} :
0 < m.Prod ↔ ∀ x ∈ m, (0 : R) < x :=
@@ -960,12 +654,6 @@ theorem CanonicallyOrderedCommSemiring.multiset_prod_pos [Nontrivial R] {m : Mul
exact CanonicallyOrderedCommSemiring.list_prod_pos
#align canonically_ordered_comm_semiring.multiset_prod_pos CanonicallyOrderedCommSemiring.multiset_prod_pos
-/- warning: canonically_ordered_comm_semiring.prod_pos -> CanonicallyOrderedCommSemiring.prod_pos is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toHasLt.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toHasLt.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (f i)))
-but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (Zero.toOfNat0.{u2} R (CommMonoidWithZero.toZero.{u2} R (CommSemiring.toCommMonoidWithZero.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (Zero.toOfNat0.{u2} R (CommMonoidWithZero.toZero.{u2} R (CommSemiring.toCommMonoidWithZero.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1))))) (f i)))
-Case conversion may be inaccurate. Consider using '#align canonically_ordered_comm_semiring.prod_pos CanonicallyOrderedCommSemiring.prod_posₓ'. -/
/-- Note that the name is to match `canonically_ordered_comm_semiring.mul_pos`. -/
@[simp]
theorem CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
@@ -973,12 +661,6 @@ theorem CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
CanonicallyOrderedCommSemiring.multiset_prod_pos.trans <| by simp
#align canonically_ordered_comm_semiring.prod_pos CanonicallyOrderedCommSemiring.prod_pos
-/- warning: finset.prod_add_prod_le' -> Finset.prod_add_prod_le' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {g : ι -> R} {h : ι -> R} {s : Finset.{u1} ι} {i : ι}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (g j) (f j))) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (h j) (f j))) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i)))
-but is expected to have type
- forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] {f : ι -> R} {g : ι -> R} {h : ι -> R} {s : Finset.{u2} ι} {i : ι}, (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (g j) (f j))) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (h j) (f j))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))) (Finset.prod.{u1, u2} R ι (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u1, u2} R ι (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u1, u2} R ι (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) s (fun (i : ι) => f i)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_add_prod_le' Finset.prod_add_prod_le'ₓ'. -/
/-- If `g, h ≤ f` and `g i + h i ≤ f i`, then the product of `f` over `s` is at least the
sum of the products of `g` and `h`. This is the version for `canonically_ordered_comm_semiring`.
-/
@@ -1029,12 +711,6 @@ namespace WithTop
open Finset
-/- warning: with_top.prod_lt_top -> WithTop.prod_lt_top is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CommMonoidWithZero.{u2} R] [_inst_2 : NoZeroDivisors.{u2} R (MulZeroClass.toHasMul.{u2} R (MulZeroOneClass.toMulZeroClass.{u2} R (MonoidWithZero.toMulZeroOneClass.{u2} R (CommMonoidWithZero.toMonoidWithZero.{u2} R _inst_1)))) (MulZeroClass.toHasZero.{u2} R (MulZeroOneClass.toMulZeroClass.{u2} R (MonoidWithZero.toMulZeroOneClass.{u2} R (CommMonoidWithZero.toMonoidWithZero.{u2} R _inst_1))))] [_inst_3 : Nontrivial.{u2} R] [_inst_4 : DecidableEq.{succ u2} R] [_inst_5 : LT.{u2} R] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} R)}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Ne.{succ u2} (WithTop.{u2} R) (f i) (Top.top.{u2} (WithTop.{u2} R) (WithTop.hasTop.{u2} R)))) -> (LT.lt.{u2} (WithTop.{u2} R) (WithTop.hasLt.{u2} R _inst_5) (Finset.prod.{u2, u1} (WithTop.{u2} R) ι (CommMonoidWithZero.toCommMonoid.{u2} (WithTop.{u2} R) (WithTop.commMonoidWithZero.{u2} R (fun (a : R) (b : R) => _inst_4 a b) _inst_1 _inst_2 _inst_3)) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} R) (WithTop.hasTop.{u2} R)))
-but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CommMonoidWithZero.{u2} R] [_inst_2 : NoZeroDivisors.{u2} R (MulZeroClass.toMul.{u2} R (MulZeroOneClass.toMulZeroClass.{u2} R (MonoidWithZero.toMulZeroOneClass.{u2} R (CommMonoidWithZero.toMonoidWithZero.{u2} R _inst_1)))) (CommMonoidWithZero.toZero.{u2} R _inst_1)] [_inst_3 : Nontrivial.{u2} R] [_inst_4 : DecidableEq.{succ u2} R] [_inst_5 : LT.{u2} R] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} R)}, (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (Ne.{succ u2} (WithTop.{u2} R) (f i) (Top.top.{u2} (WithTop.{u2} R) (WithTop.top.{u2} R)))) -> (LT.lt.{u2} (WithTop.{u2} R) (WithTop.lt.{u2} R _inst_5) (Finset.prod.{u2, u1} (WithTop.{u2} R) ι (CommMonoidWithZero.toCommMonoid.{u2} (WithTop.{u2} R) (WithTop.commMonoidWithZero.{u2} R (fun (a : R) (b : R) => _inst_4 a b) _inst_1 _inst_2 _inst_3)) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} R) (WithTop.top.{u2} R)))
-Case conversion may be inaccurate. Consider using '#align with_top.prod_lt_top WithTop.prod_lt_topₓ'. -/
/-- A product of finite numbers is still finite -/
theorem prod_lt_top [CommMonoidWithZero R] [NoZeroDivisors R] [Nontrivial R] [DecidableEq R] [LT R]
{s : Finset ι} {f : ι → WithTop R} (h : ∀ i ∈ s, f i ≠ ⊤) : (∏ i in s, f i) < ⊤ :=
@@ -1042,36 +718,18 @@ theorem prod_lt_top [CommMonoidWithZero R] [NoZeroDivisors R] [Nontrivial R] [De
WithTop.lt_top_iff_ne_top.2 (h a ha)
#align with_top.prod_lt_top WithTop.prod_lt_top
-/- warning: with_top.sum_eq_top_iff -> WithTop.sum_eq_top_iff is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (Eq.{succ u2} (WithTop.{u2} M) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M))) (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => Eq.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M)))))
-but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (Eq.{succ u2} (WithTop.{u2} M) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M))) (Exists.{succ u1} ι (fun (i : ι) => And (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) (Eq.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M)))))
-Case conversion may be inaccurate. Consider using '#align with_top.sum_eq_top_iff WithTop.sum_eq_top_iffₓ'. -/
/-- A sum of numbers is infinite iff one of them is infinite -/
theorem sum_eq_top_iff [AddCommMonoid M] {s : Finset ι} {f : ι → WithTop M} :
(∑ i in s, f i) = ⊤ ↔ ∃ i ∈ s, f i = ⊤ := by
induction s using Finset.cons_induction <;> simp [*, or_and_right, exists_or]
#align with_top.sum_eq_top_iff WithTop.sum_eq_top_iff
-/- warning: with_top.sum_lt_top_iff -> WithTop.sum_lt_top_iff is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] [_inst_2 : LT.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (LT.lt.{u2} (WithTop.{u2} M) (WithTop.hasLt.{u2} M _inst_2) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} (WithTop.{u2} M) (WithTop.hasLt.{u2} M _inst_2) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M))))
-but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] [_inst_2 : LT.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (LT.lt.{u2} (WithTop.{u2} M) (WithTop.lt.{u2} M _inst_2) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M))) (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (LT.lt.{u2} (WithTop.{u2} M) (WithTop.lt.{u2} M _inst_2) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M))))
-Case conversion may be inaccurate. Consider using '#align with_top.sum_lt_top_iff WithTop.sum_lt_top_iffₓ'. -/
/-- A sum of finite numbers is still finite -/
theorem sum_lt_top_iff [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M} :
(∑ i in s, f i) < ⊤ ↔ ∀ i ∈ s, f i < ⊤ := by
simp only [WithTop.lt_top_iff_ne_top, Ne.def, sum_eq_top_iff, not_exists]
#align with_top.sum_lt_top_iff WithTop.sum_lt_top_iff
-/- warning: with_top.sum_lt_top -> WithTop.sum_lt_top is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] [_inst_2 : LT.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Ne.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M)))) -> (LT.lt.{u2} (WithTop.{u2} M) (WithTop.hasLt.{u2} M _inst_2) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M)))
-but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] [_inst_2 : LT.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (Ne.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M)))) -> (LT.lt.{u2} (WithTop.{u2} M) (WithTop.lt.{u2} M _inst_2) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M)))
-Case conversion may be inaccurate. Consider using '#align with_top.sum_lt_top WithTop.sum_lt_topₓ'. -/
/-- A sum of finite numbers is still finite -/
theorem sum_lt_top [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M}
(h : ∀ i ∈ s, f i ≠ ⊤) : (∑ i in s, f i) < ⊤ :=
@@ -1084,46 +742,22 @@ section AbsoluteValue
variable {S : Type _}
-/- warning: absolute_value.sum_le -> AbsoluteValue.sum_le is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} {S : Type.{u3}} [_inst_1 : Semiring.{u2} R] [_inst_2 : OrderedSemiring.{u3} S] (abv : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (s : Finset.{u1} ι) (f : ι -> R), LE.le.{u3} S (Preorder.toHasLe.{u3} S (PartialOrder.toPreorder.{u3} S (OrderedAddCommMonoid.toPartialOrder.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)))) (coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (fun (f : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S _inst_1 _inst_2) abv (Finset.sum.{u2, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u3, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)) s (fun (i : ι) => coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (fun (f : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S _inst_1 _inst_2) abv (f i)))
-but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : Semiring.{u3} R] [_inst_2 : OrderedSemiring.{u2} S] (abv : AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) (s : Finset.{u1} ι) (f : ι -> R), LE.le.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Preorder.toLE.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (PartialOrder.toPreorder.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (OrderedSemiring.toPartialOrder.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) _inst_2))) (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1)))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S _inst_2))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S _inst_1 _inst_2)) abv (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u2} S (OrderedSemiring.toOrderedAddCommMonoid.{u2} S _inst_2)) s (fun (i : ι) => FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1)))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S _inst_2))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S _inst_1 _inst_2)) abv (f i)))
-Case conversion may be inaccurate. Consider using '#align absolute_value.sum_le AbsoluteValue.sum_leₓ'. -/
theorem AbsoluteValue.sum_le [Semiring R] [OrderedSemiring S] (abv : AbsoluteValue R S)
(s : Finset ι) (f : ι → R) : abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) :=
Finset.le_sum_of_subadditive abv (map_zero _) abv.add_le _ _
#align absolute_value.sum_le AbsoluteValue.sum_le
-/- warning: is_absolute_value.abv_sum -> IsAbsoluteValue.abv_sum is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} {S : Type.{u3}} [_inst_1 : Semiring.{u2} R] [_inst_2 : OrderedSemiring.{u3} S] (abv : R -> S) [_inst_3 : IsAbsoluteValue.{u3, u2} S _inst_2 R _inst_1 abv] (f : ι -> R) (s : Finset.{u1} ι), LE.le.{u3} S (Preorder.toHasLe.{u3} S (PartialOrder.toPreorder.{u3} S (OrderedAddCommMonoid.toPartialOrder.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)))) (abv (Finset.sum.{u2, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u3, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)) s (fun (i : ι) => abv (f i)))
-but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : Semiring.{u3} R] [_inst_2 : OrderedSemiring.{u2} S] (abv : R -> S) [_inst_3 : IsAbsoluteValue.{u2, u3} S _inst_2 R _inst_1 abv] (f : ι -> R) (s : Finset.{u1} ι), LE.le.{u2} S (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (abv (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u2} S (OrderedSemiring.toOrderedAddCommMonoid.{u2} S _inst_2)) s (fun (i : ι) => abv (f i)))
-Case conversion may be inaccurate. Consider using '#align is_absolute_value.abv_sum IsAbsoluteValue.abv_sumₓ'. -/
theorem IsAbsoluteValue.abv_sum [Semiring R] [OrderedSemiring S] (abv : R → S) [IsAbsoluteValue abv]
(f : ι → R) (s : Finset ι) : abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) :=
(IsAbsoluteValue.toAbsoluteValue abv).sum_le _ _
#align is_absolute_value.abv_sum IsAbsoluteValue.abv_sum
-/- warning: absolute_value.map_prod -> AbsoluteValue.map_prod is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} {S : Type.{u3}} [_inst_1 : CommSemiring.{u2} R] [_inst_2 : Nontrivial.{u2} R] [_inst_3 : LinearOrderedCommRing.{u3} S] (abv : AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) (f : ι -> R) (s : Finset.{u1} ι), Eq.{succ u3} S (coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) (fun (f : AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) abv (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R _inst_1) s (fun (i : ι) => f i))) (Finset.prod.{u3, u1} S ι (LinearOrderedCommRing.toCommMonoid.{u3} S _inst_3) s (fun (i : ι) => coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) (fun (f : AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) abv (f i)))
-but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : CommSemiring.{u3} R] [_inst_2 : Nontrivial.{u3} R] [_inst_3 : LinearOrderedCommRing.{u2} S] (abv : AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) (f : ι -> R) (s : Finset.{u1} ι), Eq.{succ u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.prod.{u3, u1} R ι (CommSemiring.toCommMonoid.{u3} R _inst_1) s (fun (i : ι) => f i))) (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R _inst_1))))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3)))))) abv (Finset.prod.{u3, u1} R ι (CommSemiring.toCommMonoid.{u3} R _inst_1) s (fun (i : ι) => f i))) (Finset.prod.{u2, u1} S ι (LinearOrderedCommRing.toCommMonoid.{u2} S _inst_3) s (fun (i : ι) => FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R _inst_1))))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3)))))) abv (f i)))
-Case conversion may be inaccurate. Consider using '#align absolute_value.map_prod AbsoluteValue.map_prodₓ'. -/
theorem AbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedCommRing S]
(abv : AbsoluteValue R S) (f : ι → R) (s : Finset ι) :
abv (∏ i in s, f i) = ∏ i in s, abv (f i) :=
abv.toMonoidHom.map_prod f s
#align absolute_value.map_prod AbsoluteValue.map_prod
-/- warning: is_absolute_value.map_prod -> IsAbsoluteValue.map_prod is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} {S : Type.{u3}} [_inst_1 : CommSemiring.{u2} R] [_inst_2 : Nontrivial.{u2} R] [_inst_3 : LinearOrderedCommRing.{u3} S] (abv : R -> S) [_inst_4 : IsAbsoluteValue.{u3, u2} S (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3)))) R (CommSemiring.toSemiring.{u2} R _inst_1) abv] (f : ι -> R) (s : Finset.{u1} ι), Eq.{succ u3} S (abv (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R _inst_1) s (fun (i : ι) => f i))) (Finset.prod.{u3, u1} S ι (LinearOrderedCommRing.toCommMonoid.{u3} S _inst_3) s (fun (i : ι) => abv (f i)))
-but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : CommSemiring.{u3} R] [_inst_2 : Nontrivial.{u3} R] [_inst_3 : LinearOrderedCommRing.{u2} S] (abv : R -> S) [_inst_4 : IsAbsoluteValue.{u2, u3} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3)))) R (CommSemiring.toSemiring.{u3} R _inst_1) abv] (f : ι -> R) (s : Finset.{u1} ι), Eq.{succ u2} S (abv (Finset.prod.{u3, u1} R ι (CommSemiring.toCommMonoid.{u3} R _inst_1) s (fun (i : ι) => f i))) (Finset.prod.{u2, u1} S ι (LinearOrderedCommRing.toCommMonoid.{u2} S _inst_3) s (fun (i : ι) => abv (f i)))
-Case conversion may be inaccurate. Consider using '#align is_absolute_value.map_prod IsAbsoluteValue.map_prodₓ'. -/
theorem IsAbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedCommRing S]
(abv : R → S) [IsAbsoluteValue abv] (f : ι → R) (s : Finset ι) :
abv (∏ i in s, f i) = ∏ i in s, abv (f i) :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/917c3c072e487b3cccdbfeff17e75b40e45f66cb
@@ -542,10 +542,8 @@ but is expected to have type
forall {ι : Type.{u2}} {α : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} α] {s : Finset.{u2} ι} {f : ι -> (Finset.{u1} α)}, (Set.PairwiseDisjoint.{u1, u2} (Finset.{u1} α) ι (Finset.partialOrder.{u1} α) (Finset.instOrderBotFinsetToLEToPreorderPartialOrder.{u1} α) (Finset.toSet.{u2} ι s) f) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (Finset.Nonempty.{u1} α (f i))) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} ι s) (Finset.card.{u1} α (Finset.biUnion.{u2, u1} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)))
Case conversion may be inaccurate. Consider using '#align finset.card_le_card_bUnion Finset.card_le_card_biUnionₓ'. -/
theorem card_le_card_biUnion {s : Finset ι} {f : ι → Finset α} (hs : (s : Set ι).PairwiseDisjoint f)
- (hf : ∀ i ∈ s, (f i).Nonempty) : s.card ≤ (s.biUnion f).card :=
- by
- rw [card_bUnion hs, card_eq_sum_ones]
- exact sum_le_sum fun i hi => (hf i hi).card_pos
+ (hf : ∀ i ∈ s, (f i).Nonempty) : s.card ≤ (s.biUnion f).card := by
+ rw [card_bUnion hs, card_eq_sum_ones]; exact sum_le_sum fun i hi => (hf i hi).card_pos
#align finset.card_le_card_bUnion Finset.card_le_card_biUnion
/- warning: finset.card_le_card_bUnion_add_card_fiber -> Finset.card_le_card_biUnion_add_card_fiber is a dubious translation:
@@ -677,8 +675,7 @@ Case conversion may be inaccurate. Consider using '#align finset.prod_lt_prod_of
theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g i) :
(∏ i in s, f i) < ∏ i in s, g i := by
apply prod_lt_prod'
- · intro i hi
- apply le_of_lt (Hlt i hi)
+ · intro i hi; apply le_of_lt (Hlt i hi)
cases' hs with i hi
exact ⟨i, hi, Hlt i hi⟩
#align finset.prod_lt_prod_of_nonempty' Finset.prod_lt_prod_of_nonempty'
@@ -882,8 +879,7 @@ theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g
by
induction' s using Finset.induction with a s has ih h
· simp
- · simp only [prod_insert has]
- apply mul_le_mul
+ · simp only [prod_insert has]; apply mul_le_mul
· exact h1 a (mem_insert_self a s)
· apply ih (fun x H => h0 _ _) fun x H => h1 _ _ <;> exact mem_insert_of_mem H
· apply prod_nonneg fun x H => h0 x (mem_insert_of_mem H)
@@ -922,10 +918,8 @@ theorem prod_add_prod_le {i : ι} {f g h : ι → R} (hi : i ∈ s) (h2i : g i +
apply add_le_add <;> apply mul_le_mul_of_nonneg_left <;> try apply_assumption <;> assumption <;>
apply prod_le_prod <;>
simp (config := { contextual := true }) [*]
- · apply prod_nonneg
- simp only [and_imp, mem_sdiff, mem_singleton]
- intro j h1j h2j
- exact le_trans (hg j h1j) (hgf j h1j h2j)
+ · apply prod_nonneg; simp only [and_imp, mem_sdiff, mem_singleton]
+ intro j h1j h2j; exact le_trans (hg j h1j) (hgf j h1j h2j)
#align finset.prod_add_prod_le Finset.prod_add_prod_le
end OrderedCommSemiring
mathlib commit https://github.com/leanprover-community/mathlib/commit/0b9eaaa7686280fad8cce467f5c3c57ee6ce77f8
@@ -38,7 +38,7 @@ variable [CommMonoid M] [OrderedCommMonoid N]
/- warning: finset.le_prod_nonempty_of_submultiplicative_on_pred -> Finset.le_prod_nonempty_of_submultiplicative_on_pred is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N) (p : M -> Prop), (forall (x : M) (y : M), (p x) -> (p y) -> (LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toHasMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y)))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (p (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y))) -> (forall (g : ι -> M) (s : Finset.{u1} ι), (Finset.Nonempty.{u1} ι s) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (p (g i))) -> (LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N) (p : M -> Prop), (forall (x : M) (y : M), (p x) -> (p y) -> (LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toHasMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y)))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (p (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y))) -> (forall (g : ι -> M) (s : Finset.{u1} ι), (Finset.Nonempty.{u1} ι s) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (p (g i))) -> (LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
but is expected to have type
forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N) (p : M -> Prop), (forall (x : M) (y : M), (p x) -> (p y) -> (LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y)))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (p (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y))) -> (forall (g : ι -> M) (s : Finset.{u1} ι), (Finset.Nonempty.{u1} ι s) -> (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (p (g i))) -> (LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
Case conversion may be inaccurate. Consider using '#align finset.le_prod_nonempty_of_submultiplicative_on_pred Finset.le_prod_nonempty_of_submultiplicative_on_predₓ'. -/
@@ -68,7 +68,7 @@ add_decl_doc le_sum_nonempty_of_subadditive_on_pred
/- warning: finset.le_prod_nonempty_of_submultiplicative -> Finset.le_prod_nonempty_of_submultiplicative is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N), (forall (x : M) (y : M), LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toHasMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y))) -> (forall {s : Finset.{u1} ι}, (Finset.Nonempty.{u1} ι s) -> (forall (g : ι -> M), LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N), (forall (x : M) (y : M), LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toHasMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y))) -> (forall {s : Finset.{u1} ι}, (Finset.Nonempty.{u1} ι s) -> (forall (g : ι -> M), LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
but is expected to have type
forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N), (forall (x : M) (y : M), LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y))) -> (forall {s : Finset.{u1} ι}, (Finset.Nonempty.{u1} ι s) -> (forall (g : ι -> M), LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
Case conversion may be inaccurate. Consider using '#align finset.le_prod_nonempty_of_submultiplicative Finset.le_prod_nonempty_of_submultiplicativeₓ'. -/
@@ -88,7 +88,7 @@ add_decl_doc le_sum_nonempty_of_subadditive
/- warning: finset.le_prod_of_submultiplicative_on_pred -> Finset.le_prod_of_submultiplicative_on_pred is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N) (p : M -> Prop), (Eq.{succ u3} N (f (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1))))))) (OfNat.ofNat.{u3} N 1 (OfNat.mk.{u3} N 1 (One.one.{u3} N (MulOneClass.toHasOne.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2)))))))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toHasMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y)))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (p (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y))) -> (forall (g : ι -> M) {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (p (g i))) -> (LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N) (p : M -> Prop), (Eq.{succ u3} N (f (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1))))))) (OfNat.ofNat.{u3} N 1 (OfNat.mk.{u3} N 1 (One.one.{u3} N (MulOneClass.toHasOne.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2)))))))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toHasMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y)))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (p (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y))) -> (forall (g : ι -> M) {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (p (g i))) -> (LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
but is expected to have type
forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N) (p : M -> Prop), (Eq.{succ u3} N (f (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1))))) (OfNat.ofNat.{u3} N 1 (One.toOfNat1.{u3} N (Monoid.toOne.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2)))))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y)))) -> (forall (x : M) (y : M), (p x) -> (p y) -> (p (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y))) -> (forall (g : ι -> M) {s : Finset.{u1} ι}, (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (p (g i))) -> (LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i)))))
Case conversion may be inaccurate. Consider using '#align finset.le_prod_of_submultiplicative_on_pred Finset.le_prod_of_submultiplicative_on_predₓ'. -/
@@ -115,7 +115,7 @@ add_decl_doc le_sum_of_subadditive_on_pred
/- warning: finset.le_prod_of_submultiplicative -> Finset.le_prod_of_submultiplicative is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N), (Eq.{succ u3} N (f (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1))))))) (OfNat.ofNat.{u3} N 1 (OfNat.mk.{u3} N 1 (One.one.{u3} N (MulOneClass.toHasOne.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2)))))))) -> (forall (x : M) (y : M), LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toHasMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y))) -> (forall (s : Finset.{u1} ι) (g : ι -> M), LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N), (Eq.{succ u3} N (f (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1))))))) (OfNat.ofNat.{u3} N 1 (OfNat.mk.{u3} N 1 (One.one.{u3} N (MulOneClass.toHasOne.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2)))))))) -> (forall (x : M) (y : M), LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toHasMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toHasMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y))) -> (forall (s : Finset.{u1} ι) (g : ι -> M), LE.le.{u3} N (Preorder.toHasLe.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i))))
but is expected to have type
forall {ι : Type.{u1}} {M : Type.{u2}} {N : Type.{u3}} [_inst_1 : CommMonoid.{u2} M] [_inst_2 : OrderedCommMonoid.{u3} N] (f : M -> N), (Eq.{succ u3} N (f (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (Monoid.toOne.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1))))) (OfNat.ofNat.{u3} N 1 (One.toOfNat1.{u3} N (Monoid.toOne.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2)))))) -> (forall (x : M) (y : M), LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (HMul.hMul.{u2, u2, u2} M M M (instHMul.{u2} M (MulOneClass.toMul.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M _inst_1)))) x y)) (HMul.hMul.{u3, u3, u3} N N N (instHMul.{u3} N (MulOneClass.toMul.{u3} N (Monoid.toMulOneClass.{u3} N (CommMonoid.toMonoid.{u3} N (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2))))) (f x) (f y))) -> (forall (s : Finset.{u1} ι) (g : ι -> M), LE.le.{u3} N (Preorder.toLE.{u3} N (PartialOrder.toPreorder.{u3} N (OrderedCommMonoid.toPartialOrder.{u3} N _inst_2))) (f (Finset.prod.{u2, u1} M ι _inst_1 s (fun (i : ι) => g i))) (Finset.prod.{u3, u1} N ι (OrderedCommMonoid.toCommMonoid.{u3} N _inst_2) s (fun (i : ι) => f (g i))))
Case conversion may be inaccurate. Consider using '#align finset.le_prod_of_submultiplicative Finset.le_prod_of_submultiplicativeₓ'. -/
@@ -140,7 +140,7 @@ variable {f g : ι → N} {s t : Finset ι}
/- warning: finset.prod_le_prod' -> Finset.prod_le_prod' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {g : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f i) (g i))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => g i)))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {g : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f i) (g i))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => g i)))
but is expected to have type
forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {g : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (f i) (g i))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => g i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod' Finset.prod_le_prod'ₓ'. -/
@@ -160,7 +160,7 @@ add_decl_doc sum_le_sum
/- warning: finset.one_le_prod' -> Finset.one_le_prod' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)))
but is expected to have type
forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))) (f i))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.one_le_prod' Finset.one_le_prod'ₓ'. -/
@@ -172,7 +172,7 @@ theorem one_le_prod' (h : ∀ i ∈ s, 1 ≤ f i) : 1 ≤ ∏ i in s, f i :=
/- warning: finset.one_le_prod'' -> Finset.one_le_prod'' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i)) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)))
but is expected to have type
forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (One.toOfNat1.{u2} N (Monoid.toOne.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))) (f i)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (One.toOfNat1.{u2} N (Monoid.toOne.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.one_le_prod'' Finset.one_le_prod''ₓ'. -/
@@ -184,7 +184,7 @@ theorem one_le_prod'' (h : ∀ i : ι, 1 ≤ f i) : 1 ≤ ∏ i : ι in s, f i :
/- warning: finset.prod_le_one' -> Finset.prod_le_one' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f i) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f i) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))
but is expected to have type
forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (f i) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_one' Finset.prod_le_one'ₓ'. -/
@@ -196,7 +196,7 @@ theorem prod_le_one' (h : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 :=
/- warning: finset.prod_le_prod_of_subset_of_one_le' -> Finset.prod_le_prod_of_subset_of_one_le' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι} {t : Finset.{u1} ι}, (HasSubset.Subset.{u1} (Finset.{u1} ι) (Finset.hasSubset.{u1} ι) s t) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i t) -> (Not (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι} {t : Finset.{u1} ι}, (HasSubset.Subset.{u1} (Finset.{u1} ι) (Finset.hasSubset.{u1} ι) s t) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i t) -> (Not (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s)) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (i : ι) => f i)))
but is expected to have type
forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {s : Finset.{u2} ι} {t : Finset.{u2} ι}, (HasSubset.Subset.{u2} (Finset.{u2} ι) (Finset.instHasSubsetFinset.{u2} ι) s t) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i t) -> (Not (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s)) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))) (f i))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) t (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod_of_subset_of_one_le' Finset.prod_le_prod_of_subset_of_one_le'ₓ'. -/
@@ -214,7 +214,7 @@ theorem prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉
/- warning: finset.prod_mono_set_of_one_le' -> Finset.prod_mono_set_of_one_le' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N}, (forall (x : ι), LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f x)) -> (Monotone.{u1, u2} (Finset.{u1} ι) N (PartialOrder.toPreorder.{u1} (Finset.{u1} ι) (Finset.partialOrder.{u1} ι)) (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2)) (fun (s : Finset.{u1} ι) => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N}, (forall (x : ι), LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f x)) -> (Monotone.{u1, u2} (Finset.{u1} ι) N (PartialOrder.toPreorder.{u1} (Finset.{u1} ι) (Finset.partialOrder.{u1} ι)) (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2)) (fun (s : Finset.{u1} ι) => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)))
but is expected to have type
forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N}, (forall (x : ι), LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (One.toOfNat1.{u2} N (Monoid.toOne.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))) (f x)) -> (Monotone.{u1, u2} (Finset.{u1} ι) N (PartialOrder.toPreorder.{u1} (Finset.{u1} ι) (Finset.partialOrder.{u1} ι)) (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2)) (fun (s : Finset.{u1} ι) => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)))
Case conversion may be inaccurate. Consider using '#align finset.prod_mono_set_of_one_le' Finset.prod_mono_set_of_one_le'ₓ'. -/
@@ -226,7 +226,7 @@ theorem prod_mono_set_of_one_le' (hf : ∀ x, 1 ≤ f x) : Monotone fun s => ∏
/- warning: finset.prod_le_univ_prod_of_one_le' -> Finset.prod_le_univ_prod_of_one_le' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} [_inst_3 : Fintype.{u1} ι] {s : Finset.{u1} ι}, (forall (x : ι), LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f x)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.univ.{u1} ι _inst_3) (fun (x : ι) => f x)))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} [_inst_3 : Fintype.{u1} ι] {s : Finset.{u1} ι}, (forall (x : ι), LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f x)) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.univ.{u1} ι _inst_3) (fun (x : ι) => f x)))
but is expected to have type
forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} [_inst_3 : Fintype.{u2} ι] {s : Finset.{u2} ι}, (forall (x : ι), LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))) (f x)) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (x : ι) => f x)) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) (Finset.univ.{u2} ι _inst_3) (fun (x : ι) => f x)))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_univ_prod_of_one_le' Finset.prod_le_univ_prod_of_one_le'ₓ'. -/
@@ -239,7 +239,7 @@ theorem prod_le_univ_prod_of_one_le' [Fintype ι] {s : Finset ι} (w : ∀ x, 1
/- warning: finset.prod_eq_one_iff_of_one_le' -> Finset.prod_eq_one_iff_of_one_le' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i))) -> (Iff (Eq.{succ u2} N (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2)))))))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Eq.{succ u2} N (f i) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i))) -> (Iff (Eq.{succ u2} N (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2)))))))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Eq.{succ u2} N (f i) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))))
but is expected to have type
forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))) (f i))) -> (Iff (Eq.{succ u1} N (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2)))))) (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (Eq.{succ u1} N (f i) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))))))
Case conversion may be inaccurate. Consider using '#align finset.prod_eq_one_iff_of_one_le' Finset.prod_eq_one_iff_of_one_le'ₓ'. -/
@@ -258,7 +258,7 @@ theorem prod_eq_one_iff_of_one_le' :
/- warning: finset.prod_eq_one_iff_of_le_one' -> Finset.prod_eq_one_iff_of_le_one' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f i) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))) -> (Iff (Eq.{succ u2} N (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2)))))))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Eq.{succ u2} N (f i) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f i) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))) -> (Iff (Eq.{succ u2} N (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2)))))))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Eq.{succ u2} N (f i) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))))
but is expected to have type
forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (f i) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))))) -> (Iff (Eq.{succ u1} N (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2)))))) (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (Eq.{succ u1} N (f i) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))))))
Case conversion may be inaccurate. Consider using '#align finset.prod_eq_one_iff_of_le_one' Finset.prod_eq_one_iff_of_le_one'ₓ'. -/
@@ -271,7 +271,7 @@ theorem prod_eq_one_iff_of_le_one' :
/- warning: finset.single_le_prod' -> Finset.single_le_prod' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i))) -> (forall {a : ι}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) a s) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f a) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x))))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (f i))) -> (forall {a : ι}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) a s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f a) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x))))
but is expected to have type
forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (OfNat.ofNat.{u1} N 1 (One.toOfNat1.{u1} N (Monoid.toOne.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2))))) (f i))) -> (forall {a : ι}, (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) a s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (f a) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (x : ι) => f x))))
Case conversion may be inaccurate. Consider using '#align finset.single_le_prod' Finset.single_le_prod'ₓ'. -/
@@ -287,7 +287,7 @@ theorem single_le_prod' (hf : ∀ i ∈ s, 1 ≤ f i) {a} (h : a ∈ s) : f a
/- warning: finset.prod_le_pow_card -> Finset.prod_le_pow_card is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] (s : Finset.{u1} ι) (f : ι -> N) (n : N), (forall (x : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x s) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f x) n)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s f) (HPow.hPow.{u2, 0, u2} N Nat N (instHPow.{u2, 0} N Nat (Monoid.Pow.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2)))) n (Finset.card.{u1} ι s)))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] (s : Finset.{u1} ι) (f : ι -> N) (n : N), (forall (x : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f x) n)) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s f) (HPow.hPow.{u2, 0, u2} N Nat N (instHPow.{u2, 0} N Nat (Monoid.Pow.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2)))) n (Finset.card.{u1} ι s)))
but is expected to have type
forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] (s : Finset.{u2} ι) (f : ι -> N) (n : N), (forall (x : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) x s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (f x) n)) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s f) (HPow.hPow.{u1, 0, u1} N Nat N (instHPow.{u1, 0} N Nat (Monoid.Pow.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2)))) n (Finset.card.{u2} ι s)))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_pow_card Finset.prod_le_pow_cardₓ'. -/
@@ -303,7 +303,7 @@ theorem prod_le_pow_card (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s
/- warning: finset.pow_card_le_prod -> Finset.pow_card_le_prod is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] (s : Finset.{u1} ι) (f : ι -> N) (n : N), (forall (x : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x s) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) n (f x))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (HPow.hPow.{u2, 0, u2} N Nat N (instHPow.{u2, 0} N Nat (Monoid.Pow.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2)))) n (Finset.card.{u1} ι s)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s f))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] (s : Finset.{u1} ι) (f : ι -> N) (n : N), (forall (x : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x s) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) n (f x))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (HPow.hPow.{u2, 0, u2} N Nat N (instHPow.{u2, 0} N Nat (Monoid.Pow.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2)))) n (Finset.card.{u1} ι s)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s f))
but is expected to have type
forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] (s : Finset.{u2} ι) (f : ι -> N) (n : N), (forall (x : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) x s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) n (f x))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (HPow.hPow.{u1, 0, u1} N Nat N (instHPow.{u1, 0} N Nat (Monoid.Pow.{u1} N (CommMonoid.toMonoid.{u1} N (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2)))) n (Finset.card.{u2} ι s)) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s f))
Case conversion may be inaccurate. Consider using '#align finset.pow_card_le_prod Finset.pow_card_le_prodₓ'. -/
@@ -325,7 +325,7 @@ variable {ι' : Type _} [DecidableEq ι']
/- warning: finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' -> Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {s : Finset.{u1} ι} {ι' : Type.{u3}} [_inst_3 : DecidableEq.{succ u3} ι'] {t : Finset.{u3} ι'} {g : ι -> ι'} {f : ι -> N}, (forall (y : ι'), (Not (Membership.Mem.{u3, u3} ι' (Finset.{u3} ι') (Finset.hasMem.{u3} ι') y t)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x)))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u3} N ι' (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (y : ι') => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {s : Finset.{u1} ι} {ι' : Type.{u3}} [_inst_3 : DecidableEq.{succ u3} ι'] {t : Finset.{u3} ι'} {g : ι -> ι'} {f : ι -> N}, (forall (y : ι'), (Not (Membership.Mem.{u3, u3} ι' (Finset.{u3} ι') (Finset.hasMem.{u3} ι') y t)) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x)))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u3} N ι' (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (y : ι') => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)))
but is expected to have type
forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {s : Finset.{u1} ι} {ι' : Type.{u3}} [_inst_3 : DecidableEq.{succ u3} ι'] {t : Finset.{u3} ι'} {g : ι -> ι'} {f : ι -> N}, (forall (y : ι'), (Not (Membership.mem.{u3, u3} ι' (Finset.{u3} ι') (Finset.instMembershipFinset.{u3} ι') y t)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (One.toOfNat1.{u2} N (Monoid.toOne.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x)))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u3} N ι' (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (y : ι') => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)))
Case conversion may be inaccurate. Consider using '#align finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber'ₓ'. -/
@@ -346,7 +346,7 @@ theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι
/- warning: finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' -> Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {s : Finset.{u1} ι} {ι' : Type.{u3}} [_inst_3 : DecidableEq.{succ u3} ι'] {t : Finset.{u3} ι'} {g : ι -> ι'} {f : ι -> N}, (forall (y : ι'), (Not (Membership.Mem.{u3, u3} ι' (Finset.{u3} ι') (Finset.hasMem.{u3} ι') y t)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x)) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)) (Finset.prod.{u2, u3} N ι' (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (y : ι') => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x))))
+ forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {s : Finset.{u1} ι} {ι' : Type.{u3}} [_inst_3 : DecidableEq.{succ u3} ι'] {t : Finset.{u3} ι'} {g : ι -> ι'} {f : ι -> N}, (forall (y : ι'), (Not (Membership.Mem.{u3, u3} ι' (Finset.{u3} ι') (Finset.hasMem.{u3} ι') y t)) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x)) (OfNat.ofNat.{u2} N 1 (OfNat.mk.{u2} N 1 (One.one.{u2} N (MulOneClass.toHasOne.{u2} N (Monoid.toMulOneClass.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))))) -> (LE.le.{u2} N (Preorder.toHasLe.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)) (Finset.prod.{u2, u3} N ι' (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (y : ι') => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x))))
but is expected to have type
forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {s : Finset.{u1} ι} {ι' : Type.{u3}} [_inst_3 : DecidableEq.{succ u3} ι'] {t : Finset.{u3} ι'} {g : ι -> ι'} {f : ι -> N}, (forall (y : ι'), (Not (Membership.mem.{u3, u3} ι' (Finset.{u3} ι') (Finset.instMembershipFinset.{u3} ι') y t)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x)) (OfNat.ofNat.{u2} N 1 (One.toOfNat1.{u2} N (Monoid.toOne.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)) (Finset.prod.{u2, u3} N ι' (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (y : ι') => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x))))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one'ₓ'. -/
@@ -363,7 +363,7 @@ end OrderedCommMonoid
/- warning: finset.abs_sum_le_sum_abs -> Finset.abs_sum_le_sum_abs is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] (f : ι -> G) (s : Finset.{u1} ι), LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (f i)))
+ forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] (f : ι -> G) (s : Finset.{u1} ι), LE.le.{u2} G (Preorder.toHasLe.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (f i)))
but is expected to have type
forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] (f : ι -> G) (s : Finset.{u1} ι), LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (f i)))
Case conversion may be inaccurate. Consider using '#align finset.abs_sum_le_sum_abs Finset.abs_sum_le_sum_absₓ'. -/
@@ -374,7 +374,7 @@ theorem abs_sum_le_sum_abs {G : Type _} [LinearOrderedAddCommGroup G] (f : ι
/- warning: finset.abs_sum_of_nonneg -> Finset.abs_sum_of_nonneg is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (OfNat.mk.{u2} G 0 (Zero.zero.{u2} G (AddZeroClass.toHasZero.{u2} G (AddMonoid.toAddZeroClass.{u2} G (SubNegMonoid.toAddMonoid.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))))))))) (f i))) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} G (Preorder.toHasLe.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (OfNat.mk.{u2} G 0 (Zero.zero.{u2} G (AddZeroClass.toHasZero.{u2} G (AddMonoid.toAddZeroClass.{u2} G (SubNegMonoid.toAddMonoid.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))))))))) (f i))) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i)))
but is expected to have type
forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (Zero.toOfNat0.{u2} G (NegZeroClass.toZero.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))))) (f i))) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.abs_sum_of_nonneg Finset.abs_sum_of_nonnegₓ'. -/
@@ -385,7 +385,7 @@ theorem abs_sum_of_nonneg {G : Type _} [LinearOrderedAddCommGroup G] {f : ι →
/- warning: finset.abs_sum_of_nonneg' -> Finset.abs_sum_of_nonneg' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (OfNat.mk.{u2} G 0 (Zero.zero.{u2} G (AddZeroClass.toHasZero.{u2} G (AddMonoid.toAddZeroClass.{u2} G (SubNegMonoid.toAddMonoid.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))))))))) (f i)) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} G (Preorder.toHasLe.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (OfNat.mk.{u2} G 0 (Zero.zero.{u2} G (AddZeroClass.toHasZero.{u2} G (AddMonoid.toAddZeroClass.{u2} G (SubNegMonoid.toAddMonoid.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))))))))) (f i)) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i)))
but is expected to have type
forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (Zero.toOfNat0.{u2} G (NegZeroClass.toZero.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))))) (f i)) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.abs_sum_of_nonneg' Finset.abs_sum_of_nonneg'ₓ'. -/
@@ -600,7 +600,7 @@ theorem prod_eq_one_iff' : (∏ x in s, f x) = 1 ↔ ∀ x ∈ s, f x = 1 :=
/- warning: finset.prod_le_prod_of_subset' -> Finset.prod_le_prod_of_subset' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : CanonicallyOrderedMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι} {t : Finset.{u1} ι}, (HasSubset.Subset.{u1} (Finset.{u1} ι) (Finset.hasSubset.{u1} ι) s t) -> (LE.le.{u2} M (Preorder.toLE.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCommMonoid.toPartialOrder.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) s (fun (x : ι) => f x)) (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) t (fun (x : ι) => f x)))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : CanonicallyOrderedMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι} {t : Finset.{u1} ι}, (HasSubset.Subset.{u1} (Finset.{u1} ι) (Finset.hasSubset.{u1} ι) s t) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCommMonoid.toPartialOrder.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) s (fun (x : ι) => f x)) (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) t (fun (x : ι) => f x)))
but is expected to have type
forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : CanonicallyOrderedMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι} {t : Finset.{u2} ι}, (HasSubset.Subset.{u2} (Finset.{u2} ι) (Finset.instHasSubsetFinset.{u2} ι) s t) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCommMonoid.toPartialOrder.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)))) (Finset.prod.{u1, u2} M ι (OrderedCommMonoid.toCommMonoid.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)) s (fun (x : ι) => f x)) (Finset.prod.{u1, u2} M ι (OrderedCommMonoid.toCommMonoid.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)) t (fun (x : ι) => f x)))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod_of_subset' Finset.prod_le_prod_of_subset'ₓ'. -/
@@ -624,7 +624,7 @@ theorem prod_mono_set' (f : ι → M) : Monotone fun s => ∏ x in s, f x := fun
/- warning: finset.prod_le_prod_of_ne_one' -> Finset.prod_le_prod_of_ne_one' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : CanonicallyOrderedMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι} {t : Finset.{u1} ι}, (forall (x : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x s) -> (Ne.{succ u2} M (f x) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1))))))))) -> (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x t)) -> (LE.le.{u2} M (Preorder.toLE.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCommMonoid.toPartialOrder.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) s (fun (x : ι) => f x)) (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) t (fun (x : ι) => f x)))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : CanonicallyOrderedMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι} {t : Finset.{u1} ι}, (forall (x : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x s) -> (Ne.{succ u2} M (f x) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (CommMonoid.toMonoid.{u2} M (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1))))))))) -> (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) x t)) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCommMonoid.toPartialOrder.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) s (fun (x : ι) => f x)) (Finset.prod.{u2, u1} M ι (OrderedCommMonoid.toCommMonoid.{u2} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u2} M _inst_1)) t (fun (x : ι) => f x)))
but is expected to have type
forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : CanonicallyOrderedMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι} {t : Finset.{u2} ι}, (forall (x : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) x s) -> (Ne.{succ u1} M (f x) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (Monoid.toOne.{u1} M (CommMonoid.toMonoid.{u1} M (OrderedCommMonoid.toCommMonoid.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1))))))) -> (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) x t)) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCommMonoid.toPartialOrder.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)))) (Finset.prod.{u1, u2} M ι (OrderedCommMonoid.toCommMonoid.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)) s (fun (x : ι) => f x)) (Finset.prod.{u1, u2} M ι (OrderedCommMonoid.toCommMonoid.{u1} M (CanonicallyOrderedMonoid.toOrderedCommMonoid.{u1} M _inst_1)) t (fun (x : ι) => f x)))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod_of_ne_one' Finset.prod_le_prod_of_ne_one'ₓ'. -/
@@ -653,7 +653,7 @@ variable [OrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
/- warning: finset.prod_lt_prod' -> Finset.prod_lt_prod' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} M (Preorder.toLE.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (g i))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (g i)))) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => g i)))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (g i))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (g i)))) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => g i)))
but is expected to have type
forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (g i))) -> (Exists.{succ u2} ι (fun (i : ι) => And (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (g i)))) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => g i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_lt_prod' Finset.prod_lt_prod'ₓ'. -/
@@ -669,7 +669,7 @@ theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i <
/- warning: finset.prod_lt_prod_of_nonempty' -> Finset.prod_lt_prod_of_nonempty' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (Finset.Nonempty.{u1} ι s) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (g i))) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => g i)))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (Finset.Nonempty.{u1} ι s) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (g i))) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => g i)))
but is expected to have type
forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u2} ι}, (Finset.Nonempty.{u2} ι s) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (g i))) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => g i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_lt_prod_of_nonempty' Finset.prod_lt_prod_of_nonempty'ₓ'. -/
@@ -686,7 +686,7 @@ theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g
/- warning: finset.prod_lt_prod_of_subset' -> Finset.prod_lt_prod_of_subset' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι} {t : Finset.{u1} ι}, (HasSubset.Subset.{u1} (Finset.{u1} ι) (Finset.hasSubset.{u1} ι) s t) -> (forall {i : ι}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i t) -> (Not (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s)) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f i)) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j t) -> (Not (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s)) -> (LE.le.{u2} M (Preorder.toLE.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f j))) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (j : ι) => f j)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) t (fun (j : ι) => f j))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι} {t : Finset.{u1} ι}, (HasSubset.Subset.{u1} (Finset.{u1} ι) (Finset.hasSubset.{u1} ι) s t) -> (forall {i : ι}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i t) -> (Not (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s)) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f i)) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j t) -> (Not (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s)) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f j))) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (j : ι) => f j)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) t (fun (j : ι) => f j))))
but is expected to have type
forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι} {t : Finset.{u2} ι}, (HasSubset.Subset.{u2} (Finset.{u2} ι) (Finset.instHasSubsetFinset.{u2} ι) s t) -> (forall {i : ι}, (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i t) -> (Not (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s)) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f i)) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j t) -> (Not (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s)) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f j))) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (j : ι) => f j)) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) t (fun (j : ι) => f j))))
Case conversion may be inaccurate. Consider using '#align finset.prod_lt_prod_of_subset' Finset.prod_lt_prod_of_subset'ₓ'. -/
@@ -710,7 +710,7 @@ theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i
/- warning: finset.single_lt_prod' -> Finset.single_lt_prod' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι} {i : ι} {j : ι}, (Ne.{succ u1} ι j i) -> (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f j)) -> (forall (k : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) k s) -> (Ne.{succ u1} ι k i) -> (LE.le.{u2} M (Preorder.toLE.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f k))) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (k : ι) => f k)))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι} {i : ι} {j : ι}, (Ne.{succ u1} ι j i) -> (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f j)) -> (forall (k : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) k s) -> (Ne.{succ u1} ι k i) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f k))) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (k : ι) => f k)))
but is expected to have type
forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι} {i : ι} {j : ι}, (Ne.{succ u2} ι j i) -> (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f j)) -> (forall (k : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) k s) -> (Ne.{succ u2} ι k i) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f k))) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (k : ι) => f k)))
Case conversion may be inaccurate. Consider using '#align finset.single_lt_prod' Finset.single_lt_prod'ₓ'. -/
@@ -728,7 +728,7 @@ theorem single_lt_prod' {i j : ι} (hij : j ≠ i) (hi : i ∈ s) (hj : j ∈ s)
/- warning: finset.one_lt_prod -> Finset.one_lt_prod is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f i))) -> (Finset.Nonempty.{u1} ι s) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f i))) -> (Finset.Nonempty.{u1} ι s) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)))
but is expected to have type
forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f i))) -> (Finset.Nonempty.{u2} ι s) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.one_lt_prod Finset.one_lt_prodₓ'. -/
@@ -740,7 +740,7 @@ theorem one_lt_prod (h : ∀ i ∈ s, 1 < f i) (hs : s.Nonempty) : 1 < ∏ i in
/- warning: finset.prod_lt_one -> Finset.prod_lt_one is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))))) -> (Finset.Nonempty.{u1} ι s) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))))) -> (Finset.Nonempty.{u1} ι s) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))))
but is expected to have type
forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))))) -> (Finset.Nonempty.{u2} ι s) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))))
Case conversion may be inaccurate. Consider using '#align finset.prod_lt_one Finset.prod_lt_oneₓ'. -/
@@ -752,7 +752,7 @@ theorem prod_lt_one (h : ∀ i ∈ s, f i < 1) (hs : s.Nonempty) : (∏ i in s,
/- warning: finset.one_lt_prod' -> Finset.one_lt_prod' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} M (Preorder.toLE.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f i))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f i)))) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f i))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (f i)))) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)))
but is expected to have type
forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f i))) -> (Exists.{succ u2} ι (fun (i : ι) => And (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (f i)))) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.one_lt_prod' Finset.one_lt_prod'ₓ'. -/
@@ -764,7 +764,7 @@ theorem one_lt_prod' (h : ∀ i ∈ s, 1 ≤ f i) (hs : ∃ i ∈ s, 1 < f i) :
/- warning: finset.prod_lt_one' -> Finset.prod_lt_one' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} M (Preorder.toLE.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1)))))))))))) -> (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {f : ι -> M} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1)))))))))))) -> (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M _inst_1))))))))))
but is expected to have type
forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {f : ι -> M} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))))) -> (Exists.{succ u2} ι (fun (i : ι) => And (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1))))))))) -> (LT.lt.{u1} M (Preorder.toLT.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)) (OfNat.ofNat.{u1} M 1 (One.toOfNat1.{u1} M (RightCancelMonoid.toOne.{u1} M (CancelMonoid.toRightCancelMonoid.{u1} M (CancelCommMonoid.toCancelMonoid.{u1} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u1} M _inst_1)))))))
Case conversion may be inaccurate. Consider using '#align finset.prod_lt_one' Finset.prod_lt_one'ₓ'. -/
@@ -776,7 +776,7 @@ theorem prod_lt_one' (h : ∀ i ∈ s, f i ≤ 1) (hs : ∃ i ∈ s, f i < 1) :
/- warning: finset.prod_eq_prod_iff_of_le -> Finset.prod_eq_prod_iff_of_le is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {s : Finset.{u1} ι} {f : ι -> M} {g : ι -> M}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} M (Preorder.toLE.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (g i))) -> (Iff (Eq.{succ u2} M (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => g i))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Eq.{succ u2} M (f i) (g i))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedCancelCommMonoid.{u2} M] {s : Finset.{u1} ι} {f : ι -> M} {g : ι -> M}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M _inst_1))) (f i) (g i))) -> (Iff (Eq.{succ u2} M (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M _inst_1) s (fun (i : ι) => g i))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Eq.{succ u2} M (f i) (g i))))
but is expected to have type
forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : OrderedCancelCommMonoid.{u1} M] {s : Finset.{u2} ι} {f : ι -> M} {g : ι -> M}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M _inst_1))) (f i) (g i))) -> (Iff (Eq.{succ u1} M (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M _inst_1) s (fun (i : ι) => g i))) (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (Eq.{succ u1} M (f i) (g i))))
Case conversion may be inaccurate. Consider using '#align finset.prod_eq_prod_iff_of_le Finset.prod_eq_prod_iff_of_leₓ'. -/
@@ -803,7 +803,7 @@ variable [LinearOrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
/- warning: finset.exists_lt_of_prod_lt' -> Finset.exists_lt_of_prod_lt' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => g i))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (f i) (g i))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => g i))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (f i) (g i))))
but is expected to have type
forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => g i))) -> (Exists.{succ u1} ι (fun (i : ι) => And (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (f i) (g i))))
Case conversion may be inaccurate. Consider using '#align finset.exists_lt_of_prod_lt' Finset.exists_lt_of_prod_lt'ₓ'. -/
@@ -817,7 +817,7 @@ theorem exists_lt_of_prod_lt' (Hlt : (∏ i in s, f i) < ∏ i in s, g i) : ∃
/- warning: finset.exists_le_of_prod_le' -> Finset.exists_le_of_prod_le' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (Finset.Nonempty.{u1} ι s) -> (LE.le.{u2} M (Preorder.toLE.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => g i))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LE.le.{u2} M (Preorder.toLE.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (f i) (g i))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u1} ι}, (Finset.Nonempty.{u1} ι s) -> (LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => g i))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LE.le.{u2} M (Preorder.toHasLe.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (f i) (g i))))
but is expected to have type
forall {ι : Type.{u2}} {M : Type.{u1}} [_inst_1 : LinearOrderedCancelCommMonoid.{u1} M] {f : ι -> M} {g : ι -> M} {s : Finset.{u2} ι}, (Finset.Nonempty.{u2} ι s) -> (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u1} M _inst_1)))) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u1} M _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} M ι (OrderedCancelCommMonoid.toCommMonoid.{u1} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u1} M _inst_1)) s (fun (i : ι) => g i))) -> (Exists.{succ u2} ι (fun (i : ι) => And (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) (LE.le.{u1} M (Preorder.toLE.{u1} M (PartialOrder.toPreorder.{u1} M (OrderedCancelCommMonoid.toPartialOrder.{u1} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u1} M _inst_1)))) (f i) (g i))))
Case conversion may be inaccurate. Consider using '#align finset.exists_le_of_prod_le' Finset.exists_le_of_prod_le'ₓ'. -/
@@ -831,7 +831,7 @@ theorem exists_le_of_prod_le' (hs : s.Nonempty) (Hle : (∏ i in s, f i) ≤ ∏
/- warning: finset.exists_one_lt_of_prod_one_of_exists_ne_one' -> Finset.exists_one_lt_of_prod_one_of_exists_ne_one' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {s : Finset.{u1} ι} (f : ι -> M), (Eq.{succ u2} M (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1))))))))))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => Ne.{succ u2} M (f i) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1))))))))))))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))))))))) (f i))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {s : Finset.{u1} ι} (f : ι -> M), (Eq.{succ u2} M (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1))))))))))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => Ne.{succ u2} M (f i) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1))))))))))))) -> (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => LT.lt.{u2} M (Preorder.toHasLt.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (OfNat.ofNat.{u2} M 1 (OfNat.mk.{u2} M 1 (One.one.{u2} M (MulOneClass.toHasOne.{u2} M (Monoid.toMulOneClass.{u2} M (RightCancelMonoid.toMonoid.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))))))))) (f i))))
but is expected to have type
forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : LinearOrderedCancelCommMonoid.{u2} M] {s : Finset.{u1} ι} (f : ι -> M), (Eq.{succ u2} M (Finset.prod.{u2, u1} M ι (OrderedCancelCommMonoid.toCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (RightCancelMonoid.toOne.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))))))) -> (Exists.{succ u1} ι (fun (i : ι) => And (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) (Ne.{succ u2} M (f i) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (RightCancelMonoid.toOne.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))))))))) -> (Exists.{succ u1} ι (fun (i : ι) => And (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) (LT.lt.{u2} M (Preorder.toLT.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedCancelCommMonoid.toPartialOrder.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1)))) (OfNat.ofNat.{u2} M 1 (One.toOfNat1.{u2} M (RightCancelMonoid.toOne.{u2} M (CancelMonoid.toRightCancelMonoid.{u2} M (CancelCommMonoid.toCancelMonoid.{u2} M (OrderedCancelCommMonoid.toCancelCommMonoid.{u2} M (LinearOrderedCancelCommMonoid.toOrderedCancelCommMonoid.{u2} M _inst_1))))))) (f i))))
Case conversion may be inaccurate. Consider using '#align finset.exists_one_lt_of_prod_one_of_exists_ne_one' Finset.exists_one_lt_of_prod_one_of_exists_ne_one'ₓ'. -/
@@ -859,7 +859,7 @@ open Classical
/- warning: finset.prod_nonneg -> Finset.prod_nonneg is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : OrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (f i))) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : OrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (f i))) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)))
but is expected to have type
forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : OrderedCommSemiring.{u1} R] {f : ι -> R} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (f i))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_nonneg Finset.prod_nonnegₓ'. -/
@@ -870,7 +870,7 @@ theorem prod_nonneg (h0 : ∀ i ∈ s, 0 ≤ f i) : 0 ≤ ∏ i in s, f i :=
/- warning: finset.prod_le_prod -> Finset.prod_le_prod is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : OrderedCommSemiring.{u2} R] {f : ι -> R} {g : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (f i))) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (f i) (g i))) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => g i)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : OrderedCommSemiring.{u2} R] {f : ι -> R} {g : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (f i))) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (f i) (g i))) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => g i)))
but is expected to have type
forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : OrderedCommSemiring.{u1} R] {f : ι -> R} {g : ι -> R} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (f i))) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (f i) (g i))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => g i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod Finset.prod_le_prodₓ'. -/
@@ -892,7 +892,7 @@ theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g
/- warning: finset.prod_le_one -> Finset.prod_le_one is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : OrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (f i))) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (f i) (OfNat.ofNat.{u2} R 1 (OfNat.mk.{u2} R 1 (One.one.{u2} R (AddMonoidWithOne.toOne.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))))) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} R 1 (OfNat.mk.{u2} R 1 (One.one.{u2} R (AddMonoidWithOne.toOne.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : OrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (f i))) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (f i) (OfNat.ofNat.{u2} R 1 (OfNat.mk.{u2} R 1 (One.one.{u2} R (AddMonoidWithOne.toOne.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))))) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)) (OfNat.ofNat.{u2} R 1 (OfNat.mk.{u2} R 1 (One.one.{u2} R (AddMonoidWithOne.toOne.{u2} R (AddCommMonoidWithOne.toAddMonoidWithOne.{u2} R (NonAssocSemiring.toAddCommMonoidWithOne.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))))
but is expected to have type
forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : OrderedCommSemiring.{u1} R] {f : ι -> R} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (f i))) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (f i) (OfNat.ofNat.{u1} R 1 (One.toOfNat1.{u1} R (Semiring.toOne.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1))))))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)) (OfNat.ofNat.{u1} R 1 (One.toOfNat1.{u1} R (Semiring.toOne.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1))))))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_one Finset.prod_le_oneₓ'. -/
@@ -906,7 +906,7 @@ theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1)
/- warning: finset.prod_add_prod_le -> Finset.prod_add_prod_le is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : OrderedCommSemiring.{u2} R] {s : Finset.{u1} ι} {i : ι} {f : ι -> R} {g : ι -> R} {h : ι -> R}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (g j) (f j))) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (h j) (f j))) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (g i))) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (h i))) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : OrderedCommSemiring.{u2} R] {s : Finset.{u1} ι} {i : ι} {f : ι -> R} {g : ι -> R} {h : ι -> R}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (g j) (f j))) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (h j) (f j))) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (g i))) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))))) (h i))) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R _inst_1))))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (OrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)))
but is expected to have type
forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : OrderedCommSemiring.{u1} R] {s : Finset.{u2} ι} {i : ι} {f : ι -> R} {g : ι -> R} {h : ι -> R}, (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (g j) (f j))) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (h j) (f j))) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (g i))) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (h i))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1))))))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_add_prod_le Finset.prod_add_prod_leₓ'. -/
@@ -936,7 +936,7 @@ variable [StrictOrderedCommSemiring R] [Nontrivial R] {f : ι → R} {s : Finset
/- warning: finset.prod_pos -> Finset.prod_pos is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : StrictOrderedCommSemiring.{u2} R] [_inst_2 : Nontrivial.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedCancelAddCommMonoid.toPartialOrder.{u2} R (StrictOrderedSemiring.toOrderedCancelAddCommMonoid.{u2} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (StrictOrderedSemiring.toSemiring.{u2} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u2} R _inst_1))))))))) (f i))) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedCancelAddCommMonoid.toPartialOrder.{u2} R (StrictOrderedSemiring.toOrderedCancelAddCommMonoid.{u2} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (StrictOrderedSemiring.toSemiring.{u2} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u2} R _inst_1))))))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (StrictOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : StrictOrderedCommSemiring.{u2} R] [_inst_2 : Nontrivial.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toHasLt.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedCancelAddCommMonoid.toPartialOrder.{u2} R (StrictOrderedSemiring.toOrderedCancelAddCommMonoid.{u2} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (StrictOrderedSemiring.toSemiring.{u2} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u2} R _inst_1))))))))) (f i))) -> (LT.lt.{u2} R (Preorder.toHasLt.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedCancelAddCommMonoid.toPartialOrder.{u2} R (StrictOrderedSemiring.toOrderedCancelAddCommMonoid.{u2} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (StrictOrderedSemiring.toSemiring.{u2} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u2} R _inst_1))))))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (StrictOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)))
but is expected to have type
forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : StrictOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {f : ι -> R} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (StrictOrderedSemiring.toPartialOrder.{u1} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (StrictOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (f i))) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (StrictOrderedSemiring.toPartialOrder.{u1} R (StrictOrderedCommSemiring.toStrictOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (StrictOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (StrictOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_pos Finset.prod_posₓ'. -/
@@ -953,7 +953,7 @@ variable [CanonicallyOrderedCommSemiring R] {f g h : ι → R} {s : Finset ι} {
/- warning: canonically_ordered_comm_semiring.multiset_prod_pos -> CanonicallyOrderedCommSemiring.multiset_prod_pos is a dubious translation:
lean 3 declaration is
- forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) (Multiset.prod.{u1} R (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) m)) (forall (x : R), (Membership.Mem.{u1, u1} R (Multiset.{u1} R) (Multiset.hasMem.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) x))
+ forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toHasLt.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) (Multiset.prod.{u1} R (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) m)) (forall (x : R), (Membership.Mem.{u1, u1} R (Multiset.{u1} R) (Multiset.hasMem.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toHasLt.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) x))
but is expected to have type
forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (Multiset.prod.{u1} R (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) m)) (forall (x : R), (Membership.mem.{u1, u1} R (Multiset.{u1} R) (Multiset.instMembershipMultiset.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) x))
Case conversion may be inaccurate. Consider using '#align canonically_ordered_comm_semiring.multiset_prod_pos CanonicallyOrderedCommSemiring.multiset_prod_posₓ'. -/
@@ -968,7 +968,7 @@ theorem CanonicallyOrderedCommSemiring.multiset_prod_pos [Nontrivial R] {m : Mul
/- warning: canonically_ordered_comm_semiring.prod_pos -> CanonicallyOrderedCommSemiring.prod_pos is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (f i)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toHasLt.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toHasLt.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (f i)))
but is expected to have type
forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (Zero.toOfNat0.{u2} R (CommMonoidWithZero.toZero.{u2} R (CommSemiring.toCommMonoidWithZero.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (Zero.toOfNat0.{u2} R (CommMonoidWithZero.toZero.{u2} R (CommSemiring.toCommMonoidWithZero.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1))))) (f i)))
Case conversion may be inaccurate. Consider using '#align canonically_ordered_comm_semiring.prod_pos CanonicallyOrderedCommSemiring.prod_posₓ'. -/
@@ -981,7 +981,7 @@ theorem CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
/- warning: finset.prod_add_prod_le' -> Finset.prod_add_prod_le' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {g : ι -> R} {h : ι -> R} {s : Finset.{u1} ι} {i : ι}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (g j) (f j))) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (h j) (f j))) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {g : ι -> R} {h : ι -> R} {s : Finset.{u1} ι} {i : ι}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (g j) (f j))) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (h j) (f j))) -> (LE.le.{u2} R (Preorder.toHasLe.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i)))
but is expected to have type
forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] {f : ι -> R} {g : ι -> R} {h : ι -> R} {s : Finset.{u2} ι} {i : ι}, (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (g j) (f j))) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (h j) (f j))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))) (Finset.prod.{u1, u2} R ι (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u1, u2} R ι (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u1, u2} R ι (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_add_prod_le' Finset.prod_add_prod_le'ₓ'. -/
@@ -1092,7 +1092,7 @@ variable {S : Type _}
/- warning: absolute_value.sum_le -> AbsoluteValue.sum_le is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} {S : Type.{u3}} [_inst_1 : Semiring.{u2} R] [_inst_2 : OrderedSemiring.{u3} S] (abv : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (s : Finset.{u1} ι) (f : ι -> R), LE.le.{u3} S (Preorder.toLE.{u3} S (PartialOrder.toPreorder.{u3} S (OrderedAddCommMonoid.toPartialOrder.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)))) (coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (fun (f : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S _inst_1 _inst_2) abv (Finset.sum.{u2, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u3, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)) s (fun (i : ι) => coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (fun (f : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S _inst_1 _inst_2) abv (f i)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} {S : Type.{u3}} [_inst_1 : Semiring.{u2} R] [_inst_2 : OrderedSemiring.{u3} S] (abv : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (s : Finset.{u1} ι) (f : ι -> R), LE.le.{u3} S (Preorder.toHasLe.{u3} S (PartialOrder.toPreorder.{u3} S (OrderedAddCommMonoid.toPartialOrder.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)))) (coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (fun (f : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S _inst_1 _inst_2) abv (Finset.sum.{u2, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u3, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)) s (fun (i : ι) => coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (fun (f : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S _inst_1 _inst_2) abv (f i)))
but is expected to have type
forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : Semiring.{u3} R] [_inst_2 : OrderedSemiring.{u2} S] (abv : AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) (s : Finset.{u1} ι) (f : ι -> R), LE.le.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Preorder.toLE.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (PartialOrder.toPreorder.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (OrderedSemiring.toPartialOrder.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) _inst_2))) (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1)))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S _inst_2))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S _inst_1 _inst_2)) abv (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u2} S (OrderedSemiring.toOrderedAddCommMonoid.{u2} S _inst_2)) s (fun (i : ι) => FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1)))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S _inst_2))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S _inst_1 _inst_2)) abv (f i)))
Case conversion may be inaccurate. Consider using '#align absolute_value.sum_le AbsoluteValue.sum_leₓ'. -/
@@ -1103,7 +1103,7 @@ theorem AbsoluteValue.sum_le [Semiring R] [OrderedSemiring S] (abv : AbsoluteVal
/- warning: is_absolute_value.abv_sum -> IsAbsoluteValue.abv_sum is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} {S : Type.{u3}} [_inst_1 : Semiring.{u2} R] [_inst_2 : OrderedSemiring.{u3} S] (abv : R -> S) [_inst_3 : IsAbsoluteValue.{u3, u2} S _inst_2 R _inst_1 abv] (f : ι -> R) (s : Finset.{u1} ι), LE.le.{u3} S (Preorder.toLE.{u3} S (PartialOrder.toPreorder.{u3} S (OrderedAddCommMonoid.toPartialOrder.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)))) (abv (Finset.sum.{u2, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u3, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)) s (fun (i : ι) => abv (f i)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} {S : Type.{u3}} [_inst_1 : Semiring.{u2} R] [_inst_2 : OrderedSemiring.{u3} S] (abv : R -> S) [_inst_3 : IsAbsoluteValue.{u3, u2} S _inst_2 R _inst_1 abv] (f : ι -> R) (s : Finset.{u1} ι), LE.le.{u3} S (Preorder.toHasLe.{u3} S (PartialOrder.toPreorder.{u3} S (OrderedAddCommMonoid.toPartialOrder.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)))) (abv (Finset.sum.{u2, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u3, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)) s (fun (i : ι) => abv (f i)))
but is expected to have type
forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : Semiring.{u3} R] [_inst_2 : OrderedSemiring.{u2} S] (abv : R -> S) [_inst_3 : IsAbsoluteValue.{u2, u3} S _inst_2 R _inst_1 abv] (f : ι -> R) (s : Finset.{u1} ι), LE.le.{u2} S (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (abv (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u2} S (OrderedSemiring.toOrderedAddCommMonoid.{u2} S _inst_2)) s (fun (i : ι) => abv (f i)))
Case conversion may be inaccurate. Consider using '#align is_absolute_value.abv_sum IsAbsoluteValue.abv_sumₓ'. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/e3fb84046afd187b710170887195d50bada934ee
@@ -314,11 +314,11 @@ theorem pow_card_le_prod (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s
#align finset.pow_card_le_prod Finset.pow_card_le_prod
#align finset.card_nsmul_le_sum Finset.card_nsmul_le_sum
-#print Finset.card_bunionᵢ_le_card_mul /-
-theorem card_bunionᵢ_le_card_mul [DecidableEq β] (s : Finset ι) (f : ι → Finset β) (n : ℕ)
- (h : ∀ a ∈ s, (f a).card ≤ n) : (s.bunionᵢ f).card ≤ s.card * n :=
- card_bunionᵢ_le.trans <| sum_le_card_nsmul _ _ _ h
-#align finset.card_bUnion_le_card_mul Finset.card_bunionᵢ_le_card_mul
+#print Finset.card_biUnion_le_card_mul /-
+theorem card_biUnion_le_card_mul [DecidableEq β] (s : Finset ι) (f : ι → Finset β) (n : ℕ)
+ (h : ∀ a ∈ s, (f a).card ≤ n) : (s.biUnion f).card ≤ s.card * n :=
+ card_biUnion_le.trans <| sum_le_card_nsmul _ _ _ h
+#align finset.card_bUnion_le_card_mul Finset.card_biUnion_le_card_mul
-/
variable {ι' : Type _} [DecidableEq ι']
@@ -535,28 +535,28 @@ theorem sum_card [Fintype α] (h : ∀ a, (B.filterₓ <| (· ∈ ·) a).card =
#align finset.sum_card Finset.sum_card
-/
-/- warning: finset.card_le_card_bUnion -> Finset.card_le_card_bunionᵢ is a dubious translation:
+/- warning: finset.card_le_card_bUnion -> Finset.card_le_card_biUnion is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} α] {s : Finset.{u1} ι} {f : ι -> (Finset.{u2} α)}, (Set.PairwiseDisjoint.{u2, u1} (Finset.{u2} α) ι (Finset.partialOrder.{u2} α) (Finset.orderBot.{u2} α) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Finset.{u1} ι) (Set.{u1} ι) (HasLiftT.mk.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (CoeTCₓ.coe.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (Finset.Set.hasCoeT.{u1} ι))) s) f) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Finset.Nonempty.{u2} α (f i))) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} ι s) (Finset.card.{u2} α (Finset.bunionᵢ.{u1, u2} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)))
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} α] {s : Finset.{u1} ι} {f : ι -> (Finset.{u2} α)}, (Set.PairwiseDisjoint.{u2, u1} (Finset.{u2} α) ι (Finset.partialOrder.{u2} α) (Finset.orderBot.{u2} α) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Finset.{u1} ι) (Set.{u1} ι) (HasLiftT.mk.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (CoeTCₓ.coe.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (Finset.Set.hasCoeT.{u1} ι))) s) f) -> (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Finset.Nonempty.{u2} α (f i))) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} ι s) (Finset.card.{u2} α (Finset.biUnion.{u1, u2} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)))
but is expected to have type
- forall {ι : Type.{u2}} {α : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} α] {s : Finset.{u2} ι} {f : ι -> (Finset.{u1} α)}, (Set.PairwiseDisjoint.{u1, u2} (Finset.{u1} α) ι (Finset.partialOrder.{u1} α) (Finset.instOrderBotFinsetToLEToPreorderPartialOrder.{u1} α) (Finset.toSet.{u2} ι s) f) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (Finset.Nonempty.{u1} α (f i))) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} ι s) (Finset.card.{u1} α (Finset.bunionᵢ.{u2, u1} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)))
-Case conversion may be inaccurate. Consider using '#align finset.card_le_card_bUnion Finset.card_le_card_bunionᵢₓ'. -/
-theorem card_le_card_bunionᵢ {s : Finset ι} {f : ι → Finset α} (hs : (s : Set ι).PairwiseDisjoint f)
- (hf : ∀ i ∈ s, (f i).Nonempty) : s.card ≤ (s.bunionᵢ f).card :=
+ forall {ι : Type.{u2}} {α : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} α] {s : Finset.{u2} ι} {f : ι -> (Finset.{u1} α)}, (Set.PairwiseDisjoint.{u1, u2} (Finset.{u1} α) ι (Finset.partialOrder.{u1} α) (Finset.instOrderBotFinsetToLEToPreorderPartialOrder.{u1} α) (Finset.toSet.{u2} ι s) f) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (Finset.Nonempty.{u1} α (f i))) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} ι s) (Finset.card.{u1} α (Finset.biUnion.{u2, u1} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)))
+Case conversion may be inaccurate. Consider using '#align finset.card_le_card_bUnion Finset.card_le_card_biUnionₓ'. -/
+theorem card_le_card_biUnion {s : Finset ι} {f : ι → Finset α} (hs : (s : Set ι).PairwiseDisjoint f)
+ (hf : ∀ i ∈ s, (f i).Nonempty) : s.card ≤ (s.biUnion f).card :=
by
rw [card_bUnion hs, card_eq_sum_ones]
exact sum_le_sum fun i hi => (hf i hi).card_pos
-#align finset.card_le_card_bUnion Finset.card_le_card_bunionᵢ
+#align finset.card_le_card_bUnion Finset.card_le_card_biUnion
-/- warning: finset.card_le_card_bUnion_add_card_fiber -> Finset.card_le_card_bunionᵢ_add_card_fiber is a dubious translation:
+/- warning: finset.card_le_card_bUnion_add_card_fiber -> Finset.card_le_card_biUnion_add_card_fiber is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} α] {s : Finset.{u1} ι} {f : ι -> (Finset.{u2} α)}, (Set.PairwiseDisjoint.{u2, u1} (Finset.{u2} α) ι (Finset.partialOrder.{u2} α) (Finset.orderBot.{u2} α) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Finset.{u1} ι) (Set.{u1} ι) (HasLiftT.mk.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (CoeTCₓ.coe.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (Finset.Set.hasCoeT.{u1} ι))) s) f) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} ι s) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat Nat.hasAdd) (Finset.card.{u2} α (Finset.bunionᵢ.{u1, u2} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)) (Finset.card.{u1} ι (Finset.filter.{u1} ι (fun (i : ι) => Eq.{succ u2} (Finset.{u2} α) (f i) (EmptyCollection.emptyCollection.{u2} (Finset.{u2} α) (Finset.hasEmptyc.{u2} α))) (fun (a : ι) => Finset.decidableEq.{u2} α (fun (a : α) (b : α) => _inst_1 a b) (f a) (EmptyCollection.emptyCollection.{u2} (Finset.{u2} α) (Finset.hasEmptyc.{u2} α))) s))))
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} α] {s : Finset.{u1} ι} {f : ι -> (Finset.{u2} α)}, (Set.PairwiseDisjoint.{u2, u1} (Finset.{u2} α) ι (Finset.partialOrder.{u2} α) (Finset.orderBot.{u2} α) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Finset.{u1} ι) (Set.{u1} ι) (HasLiftT.mk.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (CoeTCₓ.coe.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (Finset.Set.hasCoeT.{u1} ι))) s) f) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} ι s) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat Nat.hasAdd) (Finset.card.{u2} α (Finset.biUnion.{u1, u2} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)) (Finset.card.{u1} ι (Finset.filter.{u1} ι (fun (i : ι) => Eq.{succ u2} (Finset.{u2} α) (f i) (EmptyCollection.emptyCollection.{u2} (Finset.{u2} α) (Finset.hasEmptyc.{u2} α))) (fun (a : ι) => Finset.decidableEq.{u2} α (fun (a : α) (b : α) => _inst_1 a b) (f a) (EmptyCollection.emptyCollection.{u2} (Finset.{u2} α) (Finset.hasEmptyc.{u2} α))) s))))
but is expected to have type
- forall {ι : Type.{u2}} {α : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} α] {s : Finset.{u2} ι} {f : ι -> (Finset.{u1} α)}, (Set.PairwiseDisjoint.{u1, u2} (Finset.{u1} α) ι (Finset.partialOrder.{u1} α) (Finset.instOrderBotFinsetToLEToPreorderPartialOrder.{u1} α) (Finset.toSet.{u2} ι s) f) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} ι s) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat instAddNat) (Finset.card.{u1} α (Finset.bunionᵢ.{u2, u1} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)) (Finset.card.{u2} ι (Finset.filter.{u2} ι (fun (i : ι) => Eq.{succ u1} (Finset.{u1} α) (f i) (EmptyCollection.emptyCollection.{u1} (Finset.{u1} α) (Finset.instEmptyCollectionFinset.{u1} α))) (fun (a : ι) => Finset.decidableEq.{u1} α (fun (a : α) (b : α) => _inst_1 a b) (f a) (EmptyCollection.emptyCollection.{u1} (Finset.{u1} α) (Finset.instEmptyCollectionFinset.{u1} α))) s))))
-Case conversion may be inaccurate. Consider using '#align finset.card_le_card_bUnion_add_card_fiber Finset.card_le_card_bunionᵢ_add_card_fiberₓ'. -/
-theorem card_le_card_bunionᵢ_add_card_fiber {s : Finset ι} {f : ι → Finset α}
+ forall {ι : Type.{u2}} {α : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} α] {s : Finset.{u2} ι} {f : ι -> (Finset.{u1} α)}, (Set.PairwiseDisjoint.{u1, u2} (Finset.{u1} α) ι (Finset.partialOrder.{u1} α) (Finset.instOrderBotFinsetToLEToPreorderPartialOrder.{u1} α) (Finset.toSet.{u2} ι s) f) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} ι s) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat instAddNat) (Finset.card.{u1} α (Finset.biUnion.{u2, u1} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)) (Finset.card.{u2} ι (Finset.filter.{u2} ι (fun (i : ι) => Eq.{succ u1} (Finset.{u1} α) (f i) (EmptyCollection.emptyCollection.{u1} (Finset.{u1} α) (Finset.instEmptyCollectionFinset.{u1} α))) (fun (a : ι) => Finset.decidableEq.{u1} α (fun (a : α) (b : α) => _inst_1 a b) (f a) (EmptyCollection.emptyCollection.{u1} (Finset.{u1} α) (Finset.instEmptyCollectionFinset.{u1} α))) s))))
+Case conversion may be inaccurate. Consider using '#align finset.card_le_card_bUnion_add_card_fiber Finset.card_le_card_biUnion_add_card_fiberₓ'. -/
+theorem card_le_card_biUnion_add_card_fiber {s : Finset ι} {f : ι → Finset α}
(hs : (s : Set ι).PairwiseDisjoint f) :
- s.card ≤ (s.bunionᵢ f).card + (s.filterₓ fun i => f i = ∅).card :=
+ s.card ≤ (s.biUnion f).card + (s.filterₓ fun i => f i = ∅).card :=
by
rw [← Finset.filter_card_add_filter_neg_card_eq_card fun i => f i = ∅, add_comm]
exact
@@ -565,20 +565,20 @@ theorem card_le_card_bunionᵢ_add_card_fiber {s : Finset ι} {f : ι → Finset
nonempty_of_ne_empty <| (mem_filter.1 hi).2).trans <|
card_le_of_subset <| bUnion_subset_bUnion_of_subset_left _ <| filter_subset _ _)
_
-#align finset.card_le_card_bUnion_add_card_fiber Finset.card_le_card_bunionᵢ_add_card_fiber
+#align finset.card_le_card_bUnion_add_card_fiber Finset.card_le_card_biUnion_add_card_fiber
-/- warning: finset.card_le_card_bUnion_add_one -> Finset.card_le_card_bunionᵢ_add_one is a dubious translation:
+/- warning: finset.card_le_card_bUnion_add_one -> Finset.card_le_card_biUnion_add_one is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} α] {s : Finset.{u1} ι} {f : ι -> (Finset.{u2} α)}, (Function.Injective.{succ u1, succ u2} ι (Finset.{u2} α) f) -> (Set.PairwiseDisjoint.{u2, u1} (Finset.{u2} α) ι (Finset.partialOrder.{u2} α) (Finset.orderBot.{u2} α) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Finset.{u1} ι) (Set.{u1} ι) (HasLiftT.mk.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (CoeTCₓ.coe.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (Finset.Set.hasCoeT.{u1} ι))) s) f) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} ι s) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat Nat.hasAdd) (Finset.card.{u2} α (Finset.bunionᵢ.{u1, u2} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)) (OfNat.ofNat.{0} Nat 1 (OfNat.mk.{0} Nat 1 (One.one.{0} Nat Nat.hasOne)))))
+ forall {ι : Type.{u1}} {α : Type.{u2}} [_inst_1 : DecidableEq.{succ u2} α] {s : Finset.{u1} ι} {f : ι -> (Finset.{u2} α)}, (Function.Injective.{succ u1, succ u2} ι (Finset.{u2} α) f) -> (Set.PairwiseDisjoint.{u2, u1} (Finset.{u2} α) ι (Finset.partialOrder.{u2} α) (Finset.orderBot.{u2} α) ((fun (a : Type.{u1}) (b : Type.{u1}) [self : HasLiftT.{succ u1, succ u1} a b] => self.0) (Finset.{u1} ι) (Set.{u1} ι) (HasLiftT.mk.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (CoeTCₓ.coe.{succ u1, succ u1} (Finset.{u1} ι) (Set.{u1} ι) (Finset.Set.hasCoeT.{u1} ι))) s) f) -> (LE.le.{0} Nat Nat.hasLe (Finset.card.{u1} ι s) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat Nat.hasAdd) (Finset.card.{u2} α (Finset.biUnion.{u1, u2} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)) (OfNat.ofNat.{0} Nat 1 (OfNat.mk.{0} Nat 1 (One.one.{0} Nat Nat.hasOne)))))
but is expected to have type
- forall {ι : Type.{u2}} {α : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} α] {s : Finset.{u2} ι} {f : ι -> (Finset.{u1} α)}, (Function.Injective.{succ u2, succ u1} ι (Finset.{u1} α) f) -> (Set.PairwiseDisjoint.{u1, u2} (Finset.{u1} α) ι (Finset.partialOrder.{u1} α) (Finset.instOrderBotFinsetToLEToPreorderPartialOrder.{u1} α) (Finset.toSet.{u2} ι s) f) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} ι s) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat instAddNat) (Finset.card.{u1} α (Finset.bunionᵢ.{u2, u1} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)) (OfNat.ofNat.{0} Nat 1 (instOfNatNat 1))))
-Case conversion may be inaccurate. Consider using '#align finset.card_le_card_bUnion_add_one Finset.card_le_card_bunionᵢ_add_oneₓ'. -/
-theorem card_le_card_bunionᵢ_add_one {s : Finset ι} {f : ι → Finset α} (hf : Injective f)
- (hs : (s : Set ι).PairwiseDisjoint f) : s.card ≤ (s.bunionᵢ f).card + 1 :=
- (card_le_card_bunionᵢ_add_card_fiber hs).trans <|
+ forall {ι : Type.{u2}} {α : Type.{u1}} [_inst_1 : DecidableEq.{succ u1} α] {s : Finset.{u2} ι} {f : ι -> (Finset.{u1} α)}, (Function.Injective.{succ u2, succ u1} ι (Finset.{u1} α) f) -> (Set.PairwiseDisjoint.{u1, u2} (Finset.{u1} α) ι (Finset.partialOrder.{u1} α) (Finset.instOrderBotFinsetToLEToPreorderPartialOrder.{u1} α) (Finset.toSet.{u2} ι s) f) -> (LE.le.{0} Nat instLENat (Finset.card.{u2} ι s) (HAdd.hAdd.{0, 0, 0} Nat Nat Nat (instHAdd.{0} Nat instAddNat) (Finset.card.{u1} α (Finset.biUnion.{u2, u1} ι α (fun (a : α) (b : α) => _inst_1 a b) s f)) (OfNat.ofNat.{0} Nat 1 (instOfNatNat 1))))
+Case conversion may be inaccurate. Consider using '#align finset.card_le_card_bUnion_add_one Finset.card_le_card_biUnion_add_oneₓ'. -/
+theorem card_le_card_biUnion_add_one {s : Finset ι} {f : ι → Finset α} (hf : Injective f)
+ (hs : (s : Set ι).PairwiseDisjoint f) : s.card ≤ (s.biUnion f).card + 1 :=
+ (card_le_card_biUnion_add_card_fiber hs).trans <|
add_le_add_left
(card_le_one.2 fun i hi j hj => hf <| (mem_filter.1 hi).2.trans (mem_filter.1 hj).2.symm) _
-#align finset.card_le_card_bUnion_add_one Finset.card_le_card_bunionᵢ_add_one
+#align finset.card_le_card_bUnion_add_one Finset.card_le_card_biUnion_add_one
end DoubleCounting
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce86f4e05e9a9b8da5e316b22c76ce76440c56a1
@@ -396,7 +396,7 @@ theorem abs_sum_of_nonneg' {G : Type _} [LinearOrderedAddCommGroup G] {f : ι
/- warning: finset.abs_prod -> Finset.abs_prod is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : LinearOrderedCommRing.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, Eq.{succ u2} R (Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (SubNegMonoid.toHasNeg.{u2} R (AddGroup.toSubNegMonoid.{u2} R (AddGroupWithOne.toAddGroup.{u2} R (NonAssocRing.toAddGroupWithOne.{u2} R (Ring.toNonAssocRing.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))))) (SemilatticeSup.toHasSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (LinearOrder.toLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => f x))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (SubNegMonoid.toHasNeg.{u2} R (AddGroup.toSubNegMonoid.{u2} R (AddGroupWithOne.toAddGroup.{u2} R (NonAssocRing.toAddGroupWithOne.{u2} R (Ring.toNonAssocRing.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))))) (SemilatticeSup.toHasSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (LinearOrder.toLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))) (f x)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : LinearOrderedCommRing.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, Eq.{succ u2} R (Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (SubNegMonoid.toHasNeg.{u2} R (AddGroup.toSubNegMonoid.{u2} R (AddGroupWithOne.toAddGroup.{u2} R (AddCommGroupWithOne.toAddGroupWithOne.{u2} R (Ring.toAddCommGroupWithOne.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))))) (SemilatticeSup.toHasSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (LinearOrder.toLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => f x))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (SubNegMonoid.toHasNeg.{u2} R (AddGroup.toSubNegMonoid.{u2} R (AddGroupWithOne.toAddGroup.{u2} R (AddCommGroupWithOne.toAddGroupWithOne.{u2} R (Ring.toAddCommGroupWithOne.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))))) (SemilatticeSup.toHasSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (LinearOrder.toLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))) (f x)))
but is expected to have type
forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : LinearOrderedCommRing.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, Eq.{succ u2} R (Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (Ring.toNeg.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))) (SemilatticeSup.toSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (DistribLattice.toLattice.{u2} R (instDistribLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1))))))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => f x))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (Ring.toNeg.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))) (SemilatticeSup.toSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (DistribLattice.toLattice.{u2} R (instDistribLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1))))))) (f x)))
Case conversion may be inaccurate. Consider using '#align finset.abs_prod Finset.abs_prodₓ'. -/
mathlib commit https://github.com/leanprover-community/mathlib/commit/ce7e9d53d4bbc38065db3b595cd5bd73c323bc1d
@@ -900,7 +900,7 @@ Case conversion may be inaccurate. Consider using '#align finset.prod_le_one Fin
See also `finset.prod_le_one'` for the case of an ordered commutative multiplicative monoid. -/
theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 :=
by
- convert ← prod_le_prod h0 h1
+ convert← prod_le_prod h0 h1
exact Finset.prod_const_one
#align finset.prod_le_one Finset.prod_le_one
mathlib commit https://github.com/leanprover-community/mathlib/commit/3180fab693e2cee3bff62675571264cb8778b212
@@ -1094,7 +1094,7 @@ variable {S : Type _}
lean 3 declaration is
forall {ι : Type.{u1}} {R : Type.{u2}} {S : Type.{u3}} [_inst_1 : Semiring.{u2} R] [_inst_2 : OrderedSemiring.{u3} S] (abv : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (s : Finset.{u1} ι) (f : ι -> R), LE.le.{u3} S (Preorder.toLE.{u3} S (PartialOrder.toPreorder.{u3} S (OrderedAddCommMonoid.toPartialOrder.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)))) (coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (fun (f : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S _inst_1 _inst_2) abv (Finset.sum.{u2, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u3, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)) s (fun (i : ι) => coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (fun (f : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S _inst_1 _inst_2) abv (f i)))
but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : Semiring.{u3} R] [_inst_2 : OrderedSemiring.{u2} S] (abv : AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) (s : Finset.{u1} ι) (f : ι -> R), LE.le.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Preorder.toLE.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (PartialOrder.toPreorder.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (OrderedSemiring.toPartialOrder.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) _inst_2))) (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1)))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S _inst_2))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S _inst_1 _inst_2)) abv (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u2} S (OrderedSemiring.toOrderedAddCommMonoid.{u2} S _inst_2)) s (fun (i : ι) => FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1)))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S _inst_2))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S _inst_1 _inst_2)) abv (f i)))
+ forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : Semiring.{u3} R] [_inst_2 : OrderedSemiring.{u2} S] (abv : AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) (s : Finset.{u1} ι) (f : ι -> R), LE.le.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Preorder.toLE.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (PartialOrder.toPreorder.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (OrderedSemiring.toPartialOrder.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) _inst_2))) (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1)))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S _inst_2))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S _inst_1 _inst_2)) abv (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u2} S (OrderedSemiring.toOrderedAddCommMonoid.{u2} S _inst_2)) s (fun (i : ι) => FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1)))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S _inst_2))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S _inst_1 _inst_2)) abv (f i)))
Case conversion may be inaccurate. Consider using '#align absolute_value.sum_le AbsoluteValue.sum_leₓ'. -/
theorem AbsoluteValue.sum_le [Semiring R] [OrderedSemiring S] (abv : AbsoluteValue R S)
(s : Finset ι) (f : ι → R) : abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) :=
@@ -1116,7 +1116,7 @@ theorem IsAbsoluteValue.abv_sum [Semiring R] [OrderedSemiring S] (abv : R → S)
lean 3 declaration is
forall {ι : Type.{u1}} {R : Type.{u2}} {S : Type.{u3}} [_inst_1 : CommSemiring.{u2} R] [_inst_2 : Nontrivial.{u2} R] [_inst_3 : LinearOrderedCommRing.{u3} S] (abv : AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) (f : ι -> R) (s : Finset.{u1} ι), Eq.{succ u3} S (coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) (fun (f : AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) abv (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R _inst_1) s (fun (i : ι) => f i))) (Finset.prod.{u3, u1} S ι (LinearOrderedCommRing.toCommMonoid.{u3} S _inst_3) s (fun (i : ι) => coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) (fun (f : AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) abv (f i)))
but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : CommSemiring.{u3} R] [_inst_2 : Nontrivial.{u3} R] [_inst_3 : LinearOrderedCommRing.{u2} S] (abv : AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) (f : ι -> R) (s : Finset.{u1} ι), Eq.{succ u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) (Finset.prod.{u3, u1} R ι (CommSemiring.toCommMonoid.{u3} R _inst_1) s (fun (i : ι) => f i))) (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R _inst_1))))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3)))))) abv (Finset.prod.{u3, u1} R ι (CommSemiring.toCommMonoid.{u3} R _inst_1) s (fun (i : ι) => f i))) (Finset.prod.{u2, u1} S ι (LinearOrderedCommRing.toCommMonoid.{u2} S _inst_3) s (fun (i : ι) => FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R _inst_1))))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3)))))) abv (f i)))
+ forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : CommSemiring.{u3} R] [_inst_2 : Nontrivial.{u3} R] [_inst_3 : LinearOrderedCommRing.{u2} S] (abv : AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) (f : ι -> R) (s : Finset.{u1} ι), Eq.{succ u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) (Finset.prod.{u3, u1} R ι (CommSemiring.toCommMonoid.{u3} R _inst_1) s (fun (i : ι) => f i))) (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R _inst_1))))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3)))))) abv (Finset.prod.{u3, u1} R ι (CommSemiring.toCommMonoid.{u3} R _inst_1) s (fun (i : ι) => f i))) (Finset.prod.{u2, u1} S ι (LinearOrderedCommRing.toCommMonoid.{u2} S _inst_3) s (fun (i : ι) => FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.99 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R _inst_1))))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3)))))) abv (f i)))
Case conversion may be inaccurate. Consider using '#align absolute_value.map_prod AbsoluteValue.map_prodₓ'. -/
theorem AbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedCommRing S]
(abv : AbsoluteValue R S) (f : ι → R) (s : Finset ι) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/4c586d291f189eecb9d00581aeb3dd998ac34442
@@ -329,7 +329,7 @@ lean 3 declaration is
but is expected to have type
forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {s : Finset.{u1} ι} {ι' : Type.{u3}} [_inst_3 : DecidableEq.{succ u3} ι'] {t : Finset.{u3} ι'} {g : ι -> ι'} {f : ι -> N}, (forall (y : ι'), (Not (Membership.mem.{u3, u3} ι' (Finset.{u3} ι') (Finset.instMembershipFinset.{u3} ι') y t)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (OfNat.ofNat.{u2} N 1 (One.toOfNat1.{u2} N (Monoid.toOne.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x)))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u3} N ι' (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (y : ι') => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)))
Case conversion may be inaccurate. Consider using '#align finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber'ₓ'. -/
-/- ./././Mathport/Syntax/Translate/Basic.lean:628:2: warning: expanding binder collection (y «expr ∉ » t) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (y «expr ∉ » t) -/
@[to_additive sum_fiberwise_le_sum_of_sum_fiber_nonneg]
theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
(h : ∀ (y) (_ : y ∉ t), (1 : N) ≤ ∏ x in s.filterₓ fun x => g x = y, f x) :
@@ -350,7 +350,7 @@ lean 3 declaration is
but is expected to have type
forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {s : Finset.{u1} ι} {ι' : Type.{u3}} [_inst_3 : DecidableEq.{succ u3} ι'] {t : Finset.{u3} ι'} {g : ι -> ι'} {f : ι -> N}, (forall (y : ι'), (Not (Membership.mem.{u3, u3} ι' (Finset.{u3} ι') (Finset.instMembershipFinset.{u3} ι') y t)) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x)) (OfNat.ofNat.{u2} N 1 (One.toOfNat1.{u2} N (Monoid.toOne.{u2} N (CommMonoid.toMonoid.{u2} N (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2))))))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (x : ι) => f x)) (Finset.prod.{u2, u3} N ι' (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) t (fun (y : ι') => Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) (Finset.filter.{u1} ι (fun (x : ι) => Eq.{succ u3} ι' (g x) y) (fun (a : ι) => _inst_3 (g a) y) s) (fun (x : ι) => f x))))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one'ₓ'. -/
-/- ./././Mathport/Syntax/Translate/Basic.lean:628:2: warning: expanding binder collection (y «expr ∉ » t) -/
+/- ./././Mathport/Syntax/Translate/Basic.lean:635:2: warning: expanding binder collection (y «expr ∉ » t) -/
@[to_additive sum_le_sum_fiberwise_of_sum_fiber_nonpos]
theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
(h : ∀ (y) (_ : y ∉ t), (∏ x in s.filterₓ fun x => g x = y, f x) ≤ 1) :
@@ -420,7 +420,7 @@ theorem card_le_mul_card_image_of_maps_to {f : α → β} {s : Finset α} {t : F
s.card ≤ n * t.card :=
calc
s.card = ∑ a in t, (s.filterₓ fun x => f x = a).card := card_eq_sum_card_fiberwise Hf
- _ ≤ ∑ _ in t, n := sum_le_sum hn
+ _ ≤ ∑ _ in t, n := (sum_le_sum hn)
_ = _ := by simp [mul_comm]
#align finset.card_le_mul_card_image_of_maps_to Finset.card_le_mul_card_image_of_maps_to
@@ -447,7 +447,7 @@ theorem mul_card_image_le_card_of_maps_to {f : α → β} {s : Finset α} {t : F
n * t.card ≤ s.card :=
calc
n * t.card = ∑ _ in t, n := by simp [mul_comm]
- _ ≤ ∑ a in t, (s.filterₓ fun x => f x = a).card := sum_le_sum hn
+ _ ≤ ∑ a in t, (s.filterₓ fun x => f x = a).card := (sum_le_sum hn)
_ = s.card := by rw [← card_eq_sum_card_fiberwise Hf]
#align finset.mul_card_image_le_card_of_maps_to Finset.mul_card_image_le_card_of_maps_to
mathlib commit https://github.com/leanprover-community/mathlib/commit/9da1b3534b65d9661eb8f42443598a92bbb49211
@@ -142,7 +142,7 @@ variable {f g : ι → N} {s t : Finset ι}
lean 3 declaration is
forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {g : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f i) (g i))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => g i)))
but is expected to have type
- forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : CanonicallyOrderedCommSemiring.{u1} N] {f : ι -> N} {g : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedSemiring.toPartialOrder.{u1} N (OrderedCommSemiring.toOrderedSemiring.{u1} N (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} N _inst_2))))) (f i) (g i))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedSemiring.toPartialOrder.{u1} N (OrderedCommSemiring.toOrderedSemiring.{u1} N (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} N _inst_2))))) (Finset.prod.{u1, u2} N ι (CommSemiring.toCommMonoid.{u1} N (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} N _inst_2)) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} N ι (CommSemiring.toCommMonoid.{u1} N (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} N _inst_2)) s (fun (i : ι) => g i)))
+ forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {g : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (f i) (g i))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => g i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod' Finset.prod_le_prod'ₓ'. -/
/-- In an ordered commutative monoid, if each factor `f i` of one finite product is less than or
equal to the corresponding factor `g i` of another finite product, then
@@ -955,7 +955,7 @@ variable [CanonicallyOrderedCommSemiring R] {f g h : ι → R} {s : Finset ι} {
lean 3 declaration is
forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) (Multiset.prod.{u1} R (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) m)) (forall (x : R), (Membership.Mem.{u1, u1} R (Multiset.{u1} R) (Multiset.hasMem.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) x))
but is expected to have type
- forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (Multiset.prod.{u1} R (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) m)) (forall (x : R), (Membership.mem.{u1, u1} R (Multiset.{u1} R) (Multiset.instMembershipMultiset.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) x))
+ forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (Multiset.prod.{u1} R (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) m)) (forall (x : R), (Membership.mem.{u1, u1} R (Multiset.{u1} R) (Multiset.instMembershipMultiset.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) x))
Case conversion may be inaccurate. Consider using '#align canonically_ordered_comm_semiring.multiset_prod_pos CanonicallyOrderedCommSemiring.multiset_prod_posₓ'. -/
@[simp]
theorem CanonicallyOrderedCommSemiring.multiset_prod_pos [Nontrivial R] {m : Multiset R} :
@@ -970,7 +970,7 @@ theorem CanonicallyOrderedCommSemiring.multiset_prod_pos [Nontrivial R] {m : Mul
lean 3 declaration is
forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (f i)))
but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (Zero.toOfNat0.{u2} R (CommMonoidWithZero.toZero.{u2} R (CommSemiring.toCommMonoidWithZero.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (Zero.toOfNat0.{u2} R (CommMonoidWithZero.toZero.{u2} R (CommSemiring.toCommMonoidWithZero.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1))))) (f i)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (Zero.toOfNat0.{u2} R (CommMonoidWithZero.toZero.{u2} R (CommSemiring.toCommMonoidWithZero.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (Zero.toOfNat0.{u2} R (CommMonoidWithZero.toZero.{u2} R (CommSemiring.toCommMonoidWithZero.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1))))) (f i)))
Case conversion may be inaccurate. Consider using '#align canonically_ordered_comm_semiring.prod_pos CanonicallyOrderedCommSemiring.prod_posₓ'. -/
/-- Note that the name is to match `canonically_ordered_comm_semiring.mul_pos`. -/
@[simp]
@@ -983,7 +983,7 @@ theorem CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
lean 3 declaration is
forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {g : ι -> R} {h : ι -> R} {s : Finset.{u1} ι} {i : ι}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (g j) (f j))) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (h j) (f j))) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i)))
but is expected to have type
- forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] {f : ι -> R} {g : ι -> R} {h : ι -> R} {s : Finset.{u2} ι} {i : ι}, (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (g j) (f j))) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (h j) (f j))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] {f : ι -> R} {g : ι -> R} {h : ι -> R} {s : Finset.{u2} ι} {i : ι}, (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (g j) (f j))) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (h j) (f j))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))) (Finset.prod.{u1, u2} R ι (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u1, u2} R ι (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u1, u2} R ι (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_add_prod_le' Finset.prod_add_prod_le'ₓ'. -/
/-- If `g, h ≤ f` and `g i + h i ≤ f i`, then the product of `f` over `s` is at least the
sum of the products of `g` and `h`. This is the version for `canonically_ordered_comm_semiring`.
mathlib commit https://github.com/leanprover-community/mathlib/commit/9da1b3534b65d9661eb8f42443598a92bbb49211
@@ -365,7 +365,7 @@ end OrderedCommMonoid
lean 3 declaration is
forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] (f : ι -> G) (s : Finset.{u1} ι), LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (f i)))
but is expected to have type
- forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] (f : ι -> G) (s : Finset.{u1} ι), LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (f i)))
+ forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] (f : ι -> G) (s : Finset.{u1} ι), LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (f i)))
Case conversion may be inaccurate. Consider using '#align finset.abs_sum_le_sum_abs Finset.abs_sum_le_sum_absₓ'. -/
theorem abs_sum_le_sum_abs {G : Type _} [LinearOrderedAddCommGroup G] (f : ι → G) (s : Finset ι) :
|∑ i in s, f i| ≤ ∑ i in s, |f i| :=
@@ -376,7 +376,7 @@ theorem abs_sum_le_sum_abs {G : Type _} [LinearOrderedAddCommGroup G] (f : ι
lean 3 declaration is
forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (OfNat.mk.{u2} G 0 (Zero.zero.{u2} G (AddZeroClass.toHasZero.{u2} G (AddMonoid.toAddZeroClass.{u2} G (SubNegMonoid.toAddMonoid.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))))))))) (f i))) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i)))
but is expected to have type
- forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (Zero.toOfNat0.{u2} G (NegZeroClass.toZero.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))))) (f i))) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (Zero.toOfNat0.{u2} G (NegZeroClass.toZero.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))))) (f i))) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.abs_sum_of_nonneg Finset.abs_sum_of_nonnegₓ'. -/
theorem abs_sum_of_nonneg {G : Type _} [LinearOrderedAddCommGroup G] {f : ι → G} {s : Finset ι}
(hf : ∀ i ∈ s, 0 ≤ f i) : |∑ i : ι in s, f i| = ∑ i : ι in s, f i := by
@@ -387,7 +387,7 @@ theorem abs_sum_of_nonneg {G : Type _} [LinearOrderedAddCommGroup G] {f : ι →
lean 3 declaration is
forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (OfNat.mk.{u2} G 0 (Zero.zero.{u2} G (AddZeroClass.toHasZero.{u2} G (AddMonoid.toAddZeroClass.{u2} G (SubNegMonoid.toAddMonoid.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))))))))) (f i)) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (SubNegMonoid.toHasNeg.{u2} G (AddGroup.toSubNegMonoid.{u2} G (AddCommGroup.toAddGroup.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (LinearOrder.toLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1))))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (AddCommGroup.toAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))) s (fun (i : ι) => f i)))
but is expected to have type
- forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (Zero.toOfNat0.{u2} G (NegZeroClass.toZero.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))))) (f i)) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toHasSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {G : Type.{u2}} [_inst_1 : LinearOrderedAddCommGroup.{u2} G] {f : ι -> G} {s : Finset.{u1} ι}, (forall (i : ι), LE.le.{u2} G (Preorder.toLE.{u2} G (PartialOrder.toPreorder.{u2} G (OrderedAddCommGroup.toPartialOrder.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1)))) (OfNat.ofNat.{u2} G 0 (Zero.toOfNat0.{u2} G (NegZeroClass.toZero.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))))) (f i)) -> (Eq.{succ u2} G (Abs.abs.{u2} G (Neg.toHasAbs.{u2} G (NegZeroClass.toNeg.{u2} G (SubNegZeroMonoid.toNegZeroClass.{u2} G (SubtractionMonoid.toSubNegZeroMonoid.{u2} G (SubtractionCommMonoid.toSubtractionMonoid.{u2} G (AddCommGroup.toDivisionAddCommMonoid.{u2} G (OrderedAddCommGroup.toAddCommGroup.{u2} G (LinearOrderedAddCommGroup.toOrderedAddCommGroup.{u2} G _inst_1))))))) (SemilatticeSup.toSup.{u2} G (Lattice.toSemilatticeSup.{u2} G (DistribLattice.toLattice.{u2} G (instDistribLattice.{u2} G (LinearOrderedAddCommGroup.toLinearOrder.{u2} G _inst_1)))))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} G ι (OrderedCancelAddCommMonoid.toAddCommMonoid.{u2} G (LinearOrderedCancelAddCommMonoid.toOrderedCancelAddCommMonoid.{u2} G (LinearOrderedAddCommGroup.toLinearOrderedAddCancelCommMonoid.{u2} G _inst_1))) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.abs_sum_of_nonneg' Finset.abs_sum_of_nonneg'ₓ'. -/
theorem abs_sum_of_nonneg' {G : Type _} [LinearOrderedAddCommGroup G] {f : ι → G} {s : Finset ι}
(hf : ∀ i, 0 ≤ f i) : |∑ i : ι in s, f i| = ∑ i : ι in s, f i := by
@@ -398,7 +398,7 @@ theorem abs_sum_of_nonneg' {G : Type _} [LinearOrderedAddCommGroup G] {f : ι
lean 3 declaration is
forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : LinearOrderedCommRing.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, Eq.{succ u2} R (Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (SubNegMonoid.toHasNeg.{u2} R (AddGroup.toSubNegMonoid.{u2} R (AddGroupWithOne.toAddGroup.{u2} R (NonAssocRing.toAddGroupWithOne.{u2} R (Ring.toNonAssocRing.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))))) (SemilatticeSup.toHasSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (LinearOrder.toLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => f x))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (SubNegMonoid.toHasNeg.{u2} R (AddGroup.toSubNegMonoid.{u2} R (AddGroupWithOne.toAddGroup.{u2} R (NonAssocRing.toAddGroupWithOne.{u2} R (Ring.toNonAssocRing.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))))) (SemilatticeSup.toHasSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (LinearOrder.toLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))))) (f x)))
but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : LinearOrderedCommRing.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, Eq.{succ u2} R (Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (Ring.toNeg.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))) (SemilatticeSup.toHasSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (DistribLattice.toLattice.{u2} R (instDistribLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1))))))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => f x))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (Ring.toNeg.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))) (SemilatticeSup.toHasSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (DistribLattice.toLattice.{u2} R (instDistribLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1))))))) (f x)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : LinearOrderedCommRing.{u2} R] {f : ι -> R} {s : Finset.{u1} ι}, Eq.{succ u2} R (Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (Ring.toNeg.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))) (SemilatticeSup.toSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (DistribLattice.toLattice.{u2} R (instDistribLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1))))))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => f x))) (Finset.prod.{u2, u1} R ι (LinearOrderedCommRing.toCommMonoid.{u2} R _inst_1) s (fun (x : ι) => Abs.abs.{u2} R (Neg.toHasAbs.{u2} R (Ring.toNeg.{u2} R (StrictOrderedRing.toRing.{u2} R (LinearOrderedRing.toStrictOrderedRing.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1)))) (SemilatticeSup.toSup.{u2} R (Lattice.toSemilatticeSup.{u2} R (DistribLattice.toLattice.{u2} R (instDistribLattice.{u2} R (LinearOrderedRing.toLinearOrder.{u2} R (LinearOrderedCommRing.toLinearOrderedRing.{u2} R _inst_1))))))) (f x)))
Case conversion may be inaccurate. Consider using '#align finset.abs_prod Finset.abs_prodₓ'. -/
theorem abs_prod {R : Type _} [LinearOrderedCommRing R] {f : ι → R} {s : Finset ι} :
|∏ x in s, f x| = ∏ x in s, |f x| :=
mathlib commit https://github.com/leanprover-community/mathlib/commit/9da1b3534b65d9661eb8f42443598a92bbb49211
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
! This file was ported from Lean 3 source module algebra.big_operators.order
-! leanprover-community/mathlib commit afdb4fa3b32d41106a4a09b371ce549ad7958abd
+! leanprover-community/mathlib commit 824f9ae93a4f5174d2ea948e2d75843dd83447bb
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -138,19 +138,19 @@ add_decl_doc le_sum_of_subadditive
variable {f g : ι → N} {s t : Finset ι}
-/- warning: finset.prod_le_prod'' -> Finset.prod_le_prod'' is a dubious translation:
+/- warning: finset.prod_le_prod' -> Finset.prod_le_prod' is a dubious translation:
lean 3 declaration is
forall {ι : Type.{u1}} {N : Type.{u2}} [_inst_2 : OrderedCommMonoid.{u2} N] {f : ι -> N} {g : ι -> N} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (f i) (g i))) -> (LE.le.{u2} N (Preorder.toLE.{u2} N (PartialOrder.toPreorder.{u2} N (OrderedCommMonoid.toPartialOrder.{u2} N _inst_2))) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} N ι (OrderedCommMonoid.toCommMonoid.{u2} N _inst_2) s (fun (i : ι) => g i)))
but is expected to have type
- forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : OrderedCommMonoid.{u1} N] {f : ι -> N} {g : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (f i) (g i))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedCommMonoid.toPartialOrder.{u1} N _inst_2))) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} N ι (OrderedCommMonoid.toCommMonoid.{u1} N _inst_2) s (fun (i : ι) => g i)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod'' Finset.prod_le_prod''ₓ'. -/
+ forall {ι : Type.{u2}} {N : Type.{u1}} [_inst_2 : CanonicallyOrderedCommSemiring.{u1} N] {f : ι -> N} {g : ι -> N} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedSemiring.toPartialOrder.{u1} N (OrderedCommSemiring.toOrderedSemiring.{u1} N (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} N _inst_2))))) (f i) (g i))) -> (LE.le.{u1} N (Preorder.toLE.{u1} N (PartialOrder.toPreorder.{u1} N (OrderedSemiring.toPartialOrder.{u1} N (OrderedCommSemiring.toOrderedSemiring.{u1} N (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} N _inst_2))))) (Finset.prod.{u1, u2} N ι (CommSemiring.toCommMonoid.{u1} N (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} N _inst_2)) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} N ι (CommSemiring.toCommMonoid.{u1} N (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} N _inst_2)) s (fun (i : ι) => g i)))
+Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod' Finset.prod_le_prod'ₓ'. -/
/-- In an ordered commutative monoid, if each factor `f i` of one finite product is less than or
equal to the corresponding factor `g i` of another finite product, then
`∏ i in s, f i ≤ ∏ i in s, g i`. -/
@[to_additive sum_le_sum]
-theorem prod_le_prod'' (h : ∀ i ∈ s, f i ≤ g i) : (∏ i in s, f i) ≤ ∏ i in s, g i :=
+theorem prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) : (∏ i in s, f i) ≤ ∏ i in s, g i :=
Multiset.prod_map_le_prod_map f g h
-#align finset.prod_le_prod'' Finset.prod_le_prod''
+#align finset.prod_le_prod' Finset.prod_le_prod'
#align finset.sum_le_sum Finset.sum_le_sum
/-- In an ordered additive commutative monoid, if each summand `f i` of one finite sum is less than
@@ -166,7 +166,7 @@ but is expected to have type
Case conversion may be inaccurate. Consider using '#align finset.one_le_prod' Finset.one_le_prod'ₓ'. -/
@[to_additive sum_nonneg]
theorem one_le_prod' (h : ∀ i ∈ s, 1 ≤ f i) : 1 ≤ ∏ i in s, f i :=
- le_trans (by rw [prod_const_one]) (prod_le_prod'' h)
+ le_trans (by rw [prod_const_one]) (prod_le_prod' h)
#align finset.one_le_prod' Finset.one_le_prod'
#align finset.sum_nonneg Finset.sum_nonneg
@@ -190,7 +190,7 @@ but is expected to have type
Case conversion may be inaccurate. Consider using '#align finset.prod_le_one' Finset.prod_le_one'ₓ'. -/
@[to_additive sum_nonpos]
theorem prod_le_one' (h : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 :=
- (prod_le_prod'' h).trans_eq (by rw [prod_const_one])
+ (prod_le_prod' h).trans_eq (by rw [prod_const_one])
#align finset.prod_le_one' Finset.prod_le_one'
#align finset.sum_nonpos Finset.sum_nonpos
@@ -663,7 +663,7 @@ theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i <
classical
rcases Hlt with ⟨i, hi, hlt⟩
rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
- exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod'' fun j hj => Hle j <| mem_of_mem_erase hj)
+ exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod' fun j hj => Hle j <| mem_of_mem_erase hj)
#align finset.prod_lt_prod' Finset.prod_lt_prod'
#align finset.sum_lt_sum Finset.sum_lt_sum
@@ -791,7 +791,7 @@ theorem prod_eq_prod_iff_of_le {f g : ι → M} (h : ∀ i ∈ s, f i ≤ g i) :
rw [Finset.prod_insert ha, Finset.prod_insert ha, Finset.forall_mem_insert, ← ih]
exact
mul_eq_mul_iff_eq_and_eq (H a (s.mem_insert_self a))
- (Finset.prod_le_prod'' fun i => H i ∘ Finset.mem_insert_of_mem)
+ (Finset.prod_le_prod' fun i => H i ∘ Finset.mem_insert_of_mem)
#align finset.prod_eq_prod_iff_of_le Finset.prod_eq_prod_iff_of_le
#align finset.sum_eq_sum_iff_of_le Finset.sum_eq_sum_iff_of_le
@@ -811,7 +811,7 @@ Case conversion may be inaccurate. Consider using '#align finset.exists_lt_of_pr
theorem exists_lt_of_prod_lt' (Hlt : (∏ i in s, f i) < ∏ i in s, g i) : ∃ i ∈ s, f i < g i :=
by
contrapose! Hlt with Hle
- exact prod_le_prod'' Hle
+ exact prod_le_prod' Hle
#align finset.exists_lt_of_prod_lt' Finset.exists_lt_of_prod_lt'
#align finset.exists_lt_of_sum_lt Finset.exists_lt_of_sum_lt
@@ -875,7 +875,7 @@ but is expected to have type
forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : OrderedCommSemiring.{u1} R] {f : ι -> R} {g : ι -> R} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (f i))) -> (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (f i) (g i))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R _inst_1)))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (OrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => g i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod Finset.prod_le_prodₓ'. -/
/-- If all `f i`, `i ∈ s`, are nonnegative and each `f i` is less than or equal to `g i`, then the
-product of `f i` is less than or equal to the product of `g i`. See also `finset.prod_le_prod''` for
+product of `f i` is less than or equal to the product of `g i`. See also `finset.prod_le_prod'` for
the case of an ordered commutative multiplicative monoid. -/
theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g i) :
(∏ i in s, f i) ≤ ∏ i in s, g i :=
@@ -953,7 +953,7 @@ variable [CanonicallyOrderedCommSemiring R] {f g h : ι → R} {s : Finset ι} {
/- warning: canonically_ordered_comm_semiring.multiset_prod_pos -> CanonicallyOrderedCommSemiring.multiset_prod_pos is a dubious translation:
lean 3 declaration is
- forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) (Multiset.prod.{u1} R (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) m)) (forall (x : R), (Membership.Mem.{u1, u1} R (Multiset.{u1} R) (Multiset.hasMem.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) x))
+ forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) (Multiset.prod.{u1} R (OrderedCommMonoid.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u1} R _inst_1)) m)) (forall (x : R), (Membership.Mem.{u1, u1} R (Multiset.{u1} R) (Multiset.hasMem.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) x))
but is expected to have type
forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (Multiset.prod.{u1} R (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) m)) (forall (x : R), (Membership.mem.{u1, u1} R (Multiset.{u1} R) (Multiset.instMembershipMultiset.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) x))
Case conversion may be inaccurate. Consider using '#align canonically_ordered_comm_semiring.multiset_prod_pos CanonicallyOrderedCommSemiring.multiset_prod_posₓ'. -/
@@ -968,7 +968,7 @@ theorem CanonicallyOrderedCommSemiring.multiset_prod_pos [Nontrivial R] {m : Mul
/- warning: canonically_ordered_comm_semiring.prod_pos -> CanonicallyOrderedCommSemiring.prod_pos is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (f i)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (f i)))
but is expected to have type
forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (Zero.toOfNat0.{u2} R (CommMonoidWithZero.toZero.{u2} R (CommSemiring.toCommMonoidWithZero.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (Zero.toOfNat0.{u2} R (CommMonoidWithZero.toZero.{u2} R (CommSemiring.toCommMonoidWithZero.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1))))) (f i)))
Case conversion may be inaccurate. Consider using '#align canonically_ordered_comm_semiring.prod_pos CanonicallyOrderedCommSemiring.prod_posₓ'. -/
@@ -979,25 +979,9 @@ theorem CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
CanonicallyOrderedCommSemiring.multiset_prod_pos.trans <| by simp
#align canonically_ordered_comm_semiring.prod_pos CanonicallyOrderedCommSemiring.prod_pos
-/- warning: finset.prod_le_prod' -> Finset.prod_le_prod' is a dubious translation:
-lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {g : ι -> R} {s : Finset.{u1} ι}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (f i) (g i))) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => g i)))
-but is expected to have type
- forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] {f : ι -> R} {g : ι -> R} {s : Finset.{u2} ι}, (forall (i : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (f i) (g i))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => g i)))
-Case conversion may be inaccurate. Consider using '#align finset.prod_le_prod' Finset.prod_le_prod'ₓ'. -/
-theorem prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) : (∏ i in s, f i) ≤ ∏ i in s, g i := by
- classical
- induction' s using Finset.induction with a s has ih h
- · simp
- · rw [Finset.prod_insert has, Finset.prod_insert has]
- apply mul_le_mul'
- · exact h _ (Finset.mem_insert_self a s)
- · exact ih fun i hi => h _ (Finset.mem_insert_of_mem hi)
-#align finset.prod_le_prod' Finset.prod_le_prod'
-
/- warning: finset.prod_add_prod_le' -> Finset.prod_add_prod_le' is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {g : ι -> R} {h : ι -> R} {s : Finset.{u1} ι} {i : ι}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (g j) (f j))) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (h j) (f j))) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {g : ι -> R} {h : ι -> R} {s : Finset.{u1} ι} {i : ι}, (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (g j) (f j))) -> (forall (j : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) j s) -> (Ne.{succ u1} ι j i) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (h j) (f j))) -> (LE.le.{u2} R (Preorder.toLE.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (HAdd.hAdd.{u2, u2, u2} R R R (instHAdd.{u2} R (Distrib.toHasAdd.{u2} R (NonUnitalNonAssocSemiring.toDistrib.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u2, u1} R ι (OrderedCommMonoid.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommMonoid.{u2} R _inst_1)) s (fun (i : ι) => f i)))
but is expected to have type
forall {ι : Type.{u2}} {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] {f : ι -> R} {g : ι -> R} {h : ι -> R} {s : Finset.{u2} ι} {i : ι}, (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) i s) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))) (g i) (h i)) (f i)) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (g j) (f j))) -> (forall (j : ι), (Membership.mem.{u2, u2} ι (Finset.{u2} ι) (Finset.instMembershipFinset.{u2} ι) j s) -> (Ne.{succ u2} ι j i) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (h j) (f j))) -> (LE.le.{u1} R (Preorder.toLE.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (HAdd.hAdd.{u1, u1, u1} R R R (instHAdd.{u1} R (Distrib.toAdd.{u1} R (NonUnitalNonAssocSemiring.toDistrib.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => g i)) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => h i))) (Finset.prod.{u1, u2} R ι (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) s (fun (i : ι) => f i)))
Case conversion may be inaccurate. Consider using '#align finset.prod_add_prod_le' Finset.prod_add_prod_le'ₓ'. -/
@@ -1028,7 +1012,7 @@ variable [Fintype ι]
#print Fintype.prod_mono' /-
@[to_additive sum_mono, mono]
theorem prod_mono' [OrderedCommMonoid M] : Monotone fun f : ι → M => ∏ i, f i := fun f g hfg =>
- Finset.prod_le_prod'' fun x _ => hfg x
+ Finset.prod_le_prod' fun x _ => hfg x
#align fintype.prod_mono' Fintype.prod_mono'
#align fintype.sum_mono Fintype.sum_mono
-/
mathlib commit https://github.com/leanprover-community/mathlib/commit/eb0cb4511aaef0da2462207b67358a0e1fe1e2ee
@@ -1110,7 +1110,7 @@ variable {S : Type _}
lean 3 declaration is
forall {ι : Type.{u1}} {R : Type.{u2}} {S : Type.{u3}} [_inst_1 : Semiring.{u2} R] [_inst_2 : OrderedSemiring.{u3} S] (abv : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (s : Finset.{u1} ι) (f : ι -> R), LE.le.{u3} S (Preorder.toLE.{u3} S (PartialOrder.toPreorder.{u3} S (OrderedAddCommMonoid.toPartialOrder.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)))) (coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (fun (f : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S _inst_1 _inst_2) abv (Finset.sum.{u2, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u3, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u3} S (OrderedSemiring.toOrderedAddCommMonoid.{u3} S _inst_2)) s (fun (i : ι) => coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) (fun (f : AbsoluteValue.{u2, u3} R S _inst_1 _inst_2) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S _inst_1 _inst_2) abv (f i)))
but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : Semiring.{u3} R] [_inst_2 : OrderedSemiring.{u2} S] (abv : AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) (s : Finset.{u1} ι) (f : ι -> R), LE.le.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.96 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Preorder.toLE.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.96 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (PartialOrder.toPreorder.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.96 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (OrderedSemiring.toPartialOrder.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.96 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) _inst_2))) (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.96 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1)))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S _inst_2))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S _inst_1 _inst_2)) abv (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u2} S (OrderedSemiring.toOrderedAddCommMonoid.{u2} S _inst_2)) s (fun (i : ι) => FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.96 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1)))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S _inst_2))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S _inst_1 _inst_2)) abv (f i)))
+ forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : Semiring.{u3} R] [_inst_2 : OrderedSemiring.{u2} S] (abv : AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) (s : Finset.{u1} ι) (f : ι -> R), LE.le.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Preorder.toLE.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (PartialOrder.toPreorder.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (OrderedSemiring.toPartialOrder.{u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) _inst_2))) (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1)))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S _inst_2))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S _inst_1 _inst_2)) abv (Finset.sum.{u3, u1} R ι (NonUnitalNonAssocSemiring.toAddCommMonoid.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1))) s (fun (i : ι) => f i))) (Finset.sum.{u2, u1} S ι (OrderedAddCommMonoid.toAddCommMonoid.{u2} S (OrderedSemiring.toOrderedAddCommMonoid.{u2} S _inst_2)) s (fun (i : ι) => FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S _inst_1 _inst_2) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R _inst_1)))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S _inst_2))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S _inst_2))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S _inst_1 _inst_2)) abv (f i)))
Case conversion may be inaccurate. Consider using '#align absolute_value.sum_le AbsoluteValue.sum_leₓ'. -/
theorem AbsoluteValue.sum_le [Semiring R] [OrderedSemiring S] (abv : AbsoluteValue R S)
(s : Finset ι) (f : ι → R) : abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) :=
@@ -1132,7 +1132,7 @@ theorem IsAbsoluteValue.abv_sum [Semiring R] [OrderedSemiring S] (abv : R → S)
lean 3 declaration is
forall {ι : Type.{u1}} {R : Type.{u2}} {S : Type.{u3}} [_inst_1 : CommSemiring.{u2} R] [_inst_2 : Nontrivial.{u2} R] [_inst_3 : LinearOrderedCommRing.{u3} S] (abv : AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) (f : ι -> R) (s : Finset.{u1} ι), Eq.{succ u3} S (coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) (fun (f : AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) abv (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R _inst_1) s (fun (i : ι) => f i))) (Finset.prod.{u3, u1} S ι (LinearOrderedCommRing.toCommMonoid.{u3} S _inst_3) s (fun (i : ι) => coeFn.{max (succ u2) (succ u3), max (succ u2) (succ u3)} (AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) (fun (f : AbsoluteValue.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) => R -> S) (AbsoluteValue.hasCoeToFun.{u2, u3} R S (CommSemiring.toSemiring.{u2} R _inst_1) (StrictOrderedSemiring.toOrderedSemiring.{u3} S (StrictOrderedRing.toStrictOrderedSemiring.{u3} S (LinearOrderedRing.toStrictOrderedRing.{u3} S (LinearOrderedCommRing.toLinearOrderedRing.{u3} S _inst_3))))) abv (f i)))
but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : CommSemiring.{u3} R] [_inst_2 : Nontrivial.{u3} R] [_inst_3 : LinearOrderedCommRing.{u2} S] (abv : AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) (f : ι -> R) (s : Finset.{u1} ι), Eq.{succ u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.96 : R) => S) (Finset.prod.{u3, u1} R ι (CommSemiring.toCommMonoid.{u3} R _inst_1) s (fun (i : ι) => f i))) (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.96 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R _inst_1))))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3)))))) abv (Finset.prod.{u3, u1} R ι (CommSemiring.toCommMonoid.{u3} R _inst_1) s (fun (i : ι) => f i))) (Finset.prod.{u2, u1} S ι (LinearOrderedCommRing.toCommMonoid.{u2} S _inst_3) s (fun (i : ι) => FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.96 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R _inst_1))))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3)))))) abv (f i)))
+ forall {ι : Type.{u1}} {R : Type.{u3}} {S : Type.{u2}} [_inst_1 : CommSemiring.{u3} R] [_inst_2 : Nontrivial.{u3} R] [_inst_3 : LinearOrderedCommRing.{u2} S] (abv : AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) (f : ι -> R) (s : Finset.{u1} ι), Eq.{succ u2} ((fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) (Finset.prod.{u3, u1} R ι (CommSemiring.toCommMonoid.{u3} R _inst_1) s (fun (i : ι) => f i))) (FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R _inst_1))))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3)))))) abv (Finset.prod.{u3, u1} R ι (CommSemiring.toCommMonoid.{u3} R _inst_1) s (fun (i : ι) => f i))) (Finset.prod.{u2, u1} S ι (LinearOrderedCommRing.toCommMonoid.{u2} S _inst_3) s (fun (i : ι) => FunLike.coe.{max (succ u3) (succ u2), succ u3, succ u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R (fun (f : R) => (fun (x._@.Mathlib.Algebra.Order.Hom.Basic._hyg.98 : R) => S) f) (SubadditiveHomClass.toFunLike.{max u3 u2, u3, u2} (AbsoluteValue.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))) R S (Distrib.toAdd.{u3} R (NonUnitalNonAssocSemiring.toDistrib.{u3} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u3} R (Semiring.toNonAssocSemiring.{u3} R (CommSemiring.toSemiring.{u3} R _inst_1))))) (Distrib.toAdd.{u2} S (NonUnitalNonAssocSemiring.toDistrib.{u2} S (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} S (Semiring.toNonAssocSemiring.{u2} S (OrderedSemiring.toSemiring.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))))) (Preorder.toLE.{u2} S (PartialOrder.toPreorder.{u2} S (OrderedSemiring.toPartialOrder.{u2} S (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3))))))) (AbsoluteValue.subadditiveHomClass.{u3, u2} R S (CommSemiring.toSemiring.{u3} R _inst_1) (OrderedCommSemiring.toOrderedSemiring.{u2} S (StrictOrderedCommSemiring.toOrderedCommSemiring.{u2} S (LinearOrderedCommSemiring.toStrictOrderedCommSemiring.{u2} S (LinearOrderedCommRing.toLinearOrderedCommSemiring.{u2} S _inst_3)))))) abv (f i)))
Case conversion may be inaccurate. Consider using '#align absolute_value.map_prod AbsoluteValue.map_prodₓ'. -/
theorem AbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedCommRing S]
(abv : AbsoluteValue R S) (f : ι → R) (s : Finset ι) :
mathlib commit https://github.com/leanprover-community/mathlib/commit/271bf175e6c51b8d31d6c0107b7bb4a967c7277e
@@ -951,6 +951,12 @@ section CanonicallyOrderedCommSemiring
variable [CanonicallyOrderedCommSemiring R] {f g h : ι → R} {s : Finset ι} {i : ι}
+/- warning: canonically_ordered_comm_semiring.multiset_prod_pos -> CanonicallyOrderedCommSemiring.multiset_prod_pos is a dubious translation:
+lean 3 declaration is
+ forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) (Multiset.prod.{u1} R (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) m)) (forall (x : R), (Membership.Mem.{u1, u1} R (Multiset.{u1} R) (Multiset.hasMem.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedAddCommMonoid.toPartialOrder.{u1} R (OrderedSemiring.toOrderedAddCommMonoid.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))) (OfNat.ofNat.{u1} R 0 (OfNat.mk.{u1} R 0 (Zero.zero.{u1} R (MulZeroClass.toHasZero.{u1} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u1} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u1} R (Semiring.toNonAssocSemiring.{u1} R (OrderedSemiring.toSemiring.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1)))))))))) x))
+but is expected to have type
+ forall {R : Type.{u1}} [_inst_1 : CanonicallyOrderedCommSemiring.{u1} R] [_inst_2 : Nontrivial.{u1} R] {m : Multiset.{u1} R}, Iff (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) (Multiset.prod.{u1} R (CommSemiring.toCommMonoid.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1)) m)) (forall (x : R), (Membership.mem.{u1, u1} R (Multiset.{u1} R) (Multiset.instMembershipMultiset.{u1} R) x m) -> (LT.lt.{u1} R (Preorder.toLT.{u1} R (PartialOrder.toPreorder.{u1} R (OrderedSemiring.toPartialOrder.{u1} R (OrderedCommSemiring.toOrderedSemiring.{u1} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u1} R _inst_1))))) (OfNat.ofNat.{u1} R 0 (Zero.toOfNat0.{u1} R (CommMonoidWithZero.toZero.{u1} R (CommSemiring.toCommMonoidWithZero.{u1} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u1} R _inst_1))))) x))
+Case conversion may be inaccurate. Consider using '#align canonically_ordered_comm_semiring.multiset_prod_pos CanonicallyOrderedCommSemiring.multiset_prod_posₓ'. -/
@[simp]
theorem CanonicallyOrderedCommSemiring.multiset_prod_pos [Nontrivial R] {m : Multiset R} :
0 < m.Prod ↔ ∀ x ∈ m, (0 : R) < x :=
@@ -960,6 +966,12 @@ theorem CanonicallyOrderedCommSemiring.multiset_prod_pos [Nontrivial R] {m : Mul
exact CanonicallyOrderedCommSemiring.list_prod_pos
#align canonically_ordered_comm_semiring.multiset_prod_pos CanonicallyOrderedCommSemiring.multiset_prod_pos
+/- warning: canonically_ordered_comm_semiring.prod_pos -> CanonicallyOrderedCommSemiring.prod_pos is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedAddCommMonoid.toPartialOrder.{u2} R (OrderedSemiring.toOrderedAddCommMonoid.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (OfNat.ofNat.{u2} R 0 (OfNat.mk.{u2} R 0 (Zero.zero.{u2} R (MulZeroClass.toHasZero.{u2} R (NonUnitalNonAssocSemiring.toMulZeroClass.{u2} R (NonAssocSemiring.toNonUnitalNonAssocSemiring.{u2} R (Semiring.toNonAssocSemiring.{u2} R (OrderedSemiring.toSemiring.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))))))) (f i)))
+but is expected to have type
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] {f : ι -> R} {s : Finset.{u1} ι} [_inst_2 : Nontrivial.{u2} R], Iff (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (Zero.toOfNat0.{u2} R (CommMonoidWithZero.toZero.{u2} R (CommSemiring.toCommMonoidWithZero.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1))))) (Finset.prod.{u2, u1} R ι (CommSemiring.toCommMonoid.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1)) s (fun (i : ι) => f i))) (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (LT.lt.{u2} R (Preorder.toLT.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1))))) (OfNat.ofNat.{u2} R 0 (Zero.toOfNat0.{u2} R (CommMonoidWithZero.toZero.{u2} R (CommSemiring.toCommMonoidWithZero.{u2} R (CanonicallyOrderedCommSemiring.toCommSemiring.{u2} R _inst_1))))) (f i)))
+Case conversion may be inaccurate. Consider using '#align canonically_ordered_comm_semiring.prod_pos CanonicallyOrderedCommSemiring.prod_posₓ'. -/
/-- Note that the name is to match `canonically_ordered_comm_semiring.mul_pos`. -/
@[simp]
theorem CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
@@ -1043,7 +1055,7 @@ open Finset
lean 3 declaration is
forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CommMonoidWithZero.{u2} R] [_inst_2 : NoZeroDivisors.{u2} R (MulZeroClass.toHasMul.{u2} R (MulZeroOneClass.toMulZeroClass.{u2} R (MonoidWithZero.toMulZeroOneClass.{u2} R (CommMonoidWithZero.toMonoidWithZero.{u2} R _inst_1)))) (MulZeroClass.toHasZero.{u2} R (MulZeroOneClass.toMulZeroClass.{u2} R (MonoidWithZero.toMulZeroOneClass.{u2} R (CommMonoidWithZero.toMonoidWithZero.{u2} R _inst_1))))] [_inst_3 : Nontrivial.{u2} R] [_inst_4 : DecidableEq.{succ u2} R] [_inst_5 : LT.{u2} R] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} R)}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Ne.{succ u2} (WithTop.{u2} R) (f i) (Top.top.{u2} (WithTop.{u2} R) (WithTop.hasTop.{u2} R)))) -> (LT.lt.{u2} (WithTop.{u2} R) (WithTop.hasLt.{u2} R _inst_5) (Finset.prod.{u2, u1} (WithTop.{u2} R) ι (CommMonoidWithZero.toCommMonoid.{u2} (WithTop.{u2} R) (WithTop.commMonoidWithZero.{u2} R (fun (a : R) (b : R) => _inst_4 a b) _inst_1 _inst_2 _inst_3)) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} R) (WithTop.hasTop.{u2} R)))
but is expected to have type
- forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] [_inst_2 : Nontrivial.{u2} R] [_inst_3 : DecidableEq.{succ u2} R] {_inst_4 : Finset.{u1} ι} {_inst_5 : ι -> (WithTop.{u2} R)}, (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i _inst_4) -> (Ne.{succ u2} (WithTop.{u2} R) (_inst_5 i) (Top.top.{u2} (WithTop.{u2} R) (WithTop.top.{u2} R)))) -> (LT.lt.{u2} (WithTop.{u2} R) (Preorder.toLT.{u2} (WithTop.{u2} R) (WithTop.preorder.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (Finset.prod.{u2, u1} (WithTop.{u2} R) ι (CommSemiring.toCommMonoid.{u2} (WithTop.{u2} R) (WithTop.commSemiring.{u2} R (fun (a : R) (b : R) => _inst_3 a b) _inst_1 _inst_2)) _inst_4 (fun (i : ι) => _inst_5 i)) (Top.top.{u2} (WithTop.{u2} R) (WithTop.top.{u2} R)))
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CommMonoidWithZero.{u2} R] [_inst_2 : NoZeroDivisors.{u2} R (MulZeroClass.toMul.{u2} R (MulZeroOneClass.toMulZeroClass.{u2} R (MonoidWithZero.toMulZeroOneClass.{u2} R (CommMonoidWithZero.toMonoidWithZero.{u2} R _inst_1)))) (CommMonoidWithZero.toZero.{u2} R _inst_1)] [_inst_3 : Nontrivial.{u2} R] [_inst_4 : DecidableEq.{succ u2} R] [_inst_5 : LT.{u2} R] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} R)}, (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (Ne.{succ u2} (WithTop.{u2} R) (f i) (Top.top.{u2} (WithTop.{u2} R) (WithTop.top.{u2} R)))) -> (LT.lt.{u2} (WithTop.{u2} R) (WithTop.lt.{u2} R _inst_5) (Finset.prod.{u2, u1} (WithTop.{u2} R) ι (CommMonoidWithZero.toCommMonoid.{u2} (WithTop.{u2} R) (WithTop.commMonoidWithZero.{u2} R (fun (a : R) (b : R) => _inst_4 a b) _inst_1 _inst_2 _inst_3)) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} R) (WithTop.top.{u2} R)))
Case conversion may be inaccurate. Consider using '#align with_top.prod_lt_top WithTop.prod_lt_topₓ'. -/
/-- A product of finite numbers is still finite -/
theorem prod_lt_top [CommMonoidWithZero R] [NoZeroDivisors R] [Nontrivial R] [DecidableEq R] [LT R]
@@ -1056,7 +1068,7 @@ theorem prod_lt_top [CommMonoidWithZero R] [NoZeroDivisors R] [Nontrivial R] [De
lean 3 declaration is
forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (Eq.{succ u2} (WithTop.{u2} M) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M))) (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => Eq.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M)))))
but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedAddCommMonoid.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (Eq.{succ u2} (WithTop.{u2} M) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M (OrderedAddCommMonoid.toAddCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M))) (Exists.{succ u1} ι (fun (i : ι) => And (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) (Eq.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M)))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (Eq.{succ u2} (WithTop.{u2} M) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M))) (Exists.{succ u1} ι (fun (i : ι) => And (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) (Eq.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M)))))
Case conversion may be inaccurate. Consider using '#align with_top.sum_eq_top_iff WithTop.sum_eq_top_iffₓ'. -/
/-- A sum of numbers is infinite iff one of them is infinite -/
theorem sum_eq_top_iff [AddCommMonoid M] {s : Finset ι} {f : ι → WithTop M} :
@@ -1068,7 +1080,7 @@ theorem sum_eq_top_iff [AddCommMonoid M] {s : Finset ι} {f : ι → WithTop M}
lean 3 declaration is
forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] [_inst_2 : LT.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (LT.lt.{u2} (WithTop.{u2} M) (WithTop.hasLt.{u2} M _inst_2) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} (WithTop.{u2} M) (WithTop.hasLt.{u2} M _inst_2) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M))))
but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedAddCommMonoid.{u2} M] {_inst_2 : Finset.{u1} ι} {s : ι -> (WithTop.{u2} M)}, Iff (LT.lt.{u2} (WithTop.{u2} M) (Preorder.toLT.{u2} (WithTop.{u2} M) (WithTop.preorder.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedAddCommMonoid.toPartialOrder.{u2} M _inst_1)))) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M (OrderedAddCommMonoid.toAddCommMonoid.{u2} M _inst_1)) _inst_2 (fun (i : ι) => s i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M))) (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i _inst_2) -> (LT.lt.{u2} (WithTop.{u2} M) (Preorder.toLT.{u2} (WithTop.{u2} M) (WithTop.preorder.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedAddCommMonoid.toPartialOrder.{u2} M _inst_1)))) (s i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] [_inst_2 : LT.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (LT.lt.{u2} (WithTop.{u2} M) (WithTop.lt.{u2} M _inst_2) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M))) (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (LT.lt.{u2} (WithTop.{u2} M) (WithTop.lt.{u2} M _inst_2) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M))))
Case conversion may be inaccurate. Consider using '#align with_top.sum_lt_top_iff WithTop.sum_lt_top_iffₓ'. -/
/-- A sum of finite numbers is still finite -/
theorem sum_lt_top_iff [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M} :
@@ -1080,7 +1092,7 @@ theorem sum_lt_top_iff [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → With
lean 3 declaration is
forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] [_inst_2 : LT.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Ne.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M)))) -> (LT.lt.{u2} (WithTop.{u2} M) (WithTop.hasLt.{u2} M _inst_2) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M)))
but is expected to have type
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedAddCommMonoid.{u2} M] {_inst_2 : Finset.{u1} ι} {s : ι -> (WithTop.{u2} M)}, (forall (ᾰ : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) ᾰ _inst_2) -> (Ne.{succ u2} (WithTop.{u2} M) (s ᾰ) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M)))) -> (LT.lt.{u2} (WithTop.{u2} M) (Preorder.toLT.{u2} (WithTop.{u2} M) (WithTop.preorder.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedAddCommMonoid.toPartialOrder.{u2} M _inst_1)))) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M (OrderedAddCommMonoid.toAddCommMonoid.{u2} M _inst_1)) _inst_2 (fun (i : ι) => s i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M)))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] [_inst_2 : LT.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) -> (Ne.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M)))) -> (LT.lt.{u2} (WithTop.{u2} M) (WithTop.lt.{u2} M _inst_2) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M)))
Case conversion may be inaccurate. Consider using '#align with_top.sum_lt_top WithTop.sum_lt_topₓ'. -/
/-- A sum of finite numbers is still finite -/
theorem sum_lt_top [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M}
mathlib commit https://github.com/leanprover-community/mathlib/commit/271bf175e6c51b8d31d6c0107b7bb4a967c7277e
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
! This file was ported from Lean 3 source module algebra.big_operators.order
-! leanprover-community/mathlib commit bb37dbda903641effc74366a2774cefdf2c6734d
+! leanprover-community/mathlib commit afdb4fa3b32d41106a4a09b371ce549ad7958abd
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -1039,48 +1039,54 @@ namespace WithTop
open Finset
-#print WithTop.prod_lt_top /-
+/- warning: with_top.prod_lt_top -> WithTop.prod_lt_top is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CommMonoidWithZero.{u2} R] [_inst_2 : NoZeroDivisors.{u2} R (MulZeroClass.toHasMul.{u2} R (MulZeroOneClass.toMulZeroClass.{u2} R (MonoidWithZero.toMulZeroOneClass.{u2} R (CommMonoidWithZero.toMonoidWithZero.{u2} R _inst_1)))) (MulZeroClass.toHasZero.{u2} R (MulZeroOneClass.toMulZeroClass.{u2} R (MonoidWithZero.toMulZeroOneClass.{u2} R (CommMonoidWithZero.toMonoidWithZero.{u2} R _inst_1))))] [_inst_3 : Nontrivial.{u2} R] [_inst_4 : DecidableEq.{succ u2} R] [_inst_5 : LT.{u2} R] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} R)}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Ne.{succ u2} (WithTop.{u2} R) (f i) (Top.top.{u2} (WithTop.{u2} R) (WithTop.hasTop.{u2} R)))) -> (LT.lt.{u2} (WithTop.{u2} R) (WithTop.hasLt.{u2} R _inst_5) (Finset.prod.{u2, u1} (WithTop.{u2} R) ι (CommMonoidWithZero.toCommMonoid.{u2} (WithTop.{u2} R) (WithTop.commMonoidWithZero.{u2} R (fun (a : R) (b : R) => _inst_4 a b) _inst_1 _inst_2 _inst_3)) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} R) (WithTop.hasTop.{u2} R)))
+but is expected to have type
+ forall {ι : Type.{u1}} {R : Type.{u2}} [_inst_1 : CanonicallyOrderedCommSemiring.{u2} R] [_inst_2 : Nontrivial.{u2} R] [_inst_3 : DecidableEq.{succ u2} R] {_inst_4 : Finset.{u1} ι} {_inst_5 : ι -> (WithTop.{u2} R)}, (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i _inst_4) -> (Ne.{succ u2} (WithTop.{u2} R) (_inst_5 i) (Top.top.{u2} (WithTop.{u2} R) (WithTop.top.{u2} R)))) -> (LT.lt.{u2} (WithTop.{u2} R) (Preorder.toLT.{u2} (WithTop.{u2} R) (WithTop.preorder.{u2} R (PartialOrder.toPreorder.{u2} R (OrderedSemiring.toPartialOrder.{u2} R (OrderedCommSemiring.toOrderedSemiring.{u2} R (CanonicallyOrderedCommSemiring.toOrderedCommSemiring.{u2} R _inst_1)))))) (Finset.prod.{u2, u1} (WithTop.{u2} R) ι (CommSemiring.toCommMonoid.{u2} (WithTop.{u2} R) (WithTop.commSemiring.{u2} R (fun (a : R) (b : R) => _inst_3 a b) _inst_1 _inst_2)) _inst_4 (fun (i : ι) => _inst_5 i)) (Top.top.{u2} (WithTop.{u2} R) (WithTop.top.{u2} R)))
+Case conversion may be inaccurate. Consider using '#align with_top.prod_lt_top WithTop.prod_lt_topₓ'. -/
/-- A product of finite numbers is still finite -/
-theorem prod_lt_top [CanonicallyOrderedCommSemiring R] [Nontrivial R] [DecidableEq R] {s : Finset ι}
- {f : ι → WithTop R} (h : ∀ i ∈ s, f i ≠ ⊤) : (∏ i in s, f i) < ⊤ :=
- prod_induction f (fun a => a < ⊤) (fun a b h₁ h₂ => mul_lt_top h₁.Ne h₂.Ne) (coe_lt_top 1)
- fun a ha => lt_top_iff_ne_top.2 (h a ha)
+theorem prod_lt_top [CommMonoidWithZero R] [NoZeroDivisors R] [Nontrivial R] [DecidableEq R] [LT R]
+ {s : Finset ι} {f : ι → WithTop R} (h : ∀ i ∈ s, f i ≠ ⊤) : (∏ i in s, f i) < ⊤ :=
+ prod_induction f (fun a => a < ⊤) (fun a b h₁ h₂ => mul_lt_top' h₁ h₂) (coe_lt_top 1) fun a ha =>
+ WithTop.lt_top_iff_ne_top.2 (h a ha)
#align with_top.prod_lt_top WithTop.prod_lt_top
--/
-
-#print WithTop.sum_lt_top /-
-/-- A sum of finite numbers is still finite -/
-theorem sum_lt_top [OrderedAddCommMonoid M] {s : Finset ι} {f : ι → WithTop M}
- (h : ∀ i ∈ s, f i ≠ ⊤) : (∑ i in s, f i) < ⊤ :=
- sum_induction f (fun a => a < ⊤) (fun a b h₁ h₂ => add_lt_top.2 ⟨h₁, h₂⟩) zero_lt_top fun i hi =>
- lt_top_iff_ne_top.2 (h i hi)
-#align with_top.sum_lt_top WithTop.sum_lt_top
--/
/- warning: with_top.sum_eq_top_iff -> WithTop.sum_eq_top_iff is a dubious translation:
lean 3 declaration is
- forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedAddCommMonoid.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (Eq.{succ u2} (WithTop.{u2} M) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M (OrderedAddCommMonoid.toAddCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M))) (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => Eq.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M)))))
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (Eq.{succ u2} (WithTop.{u2} M) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M))) (Exists.{succ u1} ι (fun (i : ι) => Exists.{0} (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) (fun (H : Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) => Eq.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M)))))
but is expected to have type
forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedAddCommMonoid.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (Eq.{succ u2} (WithTop.{u2} M) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M (OrderedAddCommMonoid.toAddCommMonoid.{u2} M _inst_1)) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M))) (Exists.{succ u1} ι (fun (i : ι) => And (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i s) (Eq.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M)))))
Case conversion may be inaccurate. Consider using '#align with_top.sum_eq_top_iff WithTop.sum_eq_top_iffₓ'. -/
/-- A sum of numbers is infinite iff one of them is infinite -/
-theorem sum_eq_top_iff [OrderedAddCommMonoid M] {s : Finset ι} {f : ι → WithTop M} :
+theorem sum_eq_top_iff [AddCommMonoid M] {s : Finset ι} {f : ι → WithTop M} :
(∑ i in s, f i) = ⊤ ↔ ∃ i ∈ s, f i = ⊤ := by
- classical
- constructor
- · contrapose!
- exact fun h => (sum_lt_top fun i hi => h i hi).Ne
- · rintro ⟨i, his, hi⟩
- rw [sum_eq_add_sum_diff_singleton his, hi, top_add]
+ induction s using Finset.cons_induction <;> simp [*, or_and_right, exists_or]
#align with_top.sum_eq_top_iff WithTop.sum_eq_top_iff
-#print WithTop.sum_lt_top_iff /-
+/- warning: with_top.sum_lt_top_iff -> WithTop.sum_lt_top_iff is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] [_inst_2 : LT.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, Iff (LT.lt.{u2} (WithTop.{u2} M) (WithTop.hasLt.{u2} M _inst_2) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M))) (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (LT.lt.{u2} (WithTop.{u2} M) (WithTop.hasLt.{u2} M _inst_2) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M))))
+but is expected to have type
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedAddCommMonoid.{u2} M] {_inst_2 : Finset.{u1} ι} {s : ι -> (WithTop.{u2} M)}, Iff (LT.lt.{u2} (WithTop.{u2} M) (Preorder.toLT.{u2} (WithTop.{u2} M) (WithTop.preorder.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedAddCommMonoid.toPartialOrder.{u2} M _inst_1)))) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M (OrderedAddCommMonoid.toAddCommMonoid.{u2} M _inst_1)) _inst_2 (fun (i : ι) => s i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M))) (forall (i : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) i _inst_2) -> (LT.lt.{u2} (WithTop.{u2} M) (Preorder.toLT.{u2} (WithTop.{u2} M) (WithTop.preorder.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedAddCommMonoid.toPartialOrder.{u2} M _inst_1)))) (s i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M))))
+Case conversion may be inaccurate. Consider using '#align with_top.sum_lt_top_iff WithTop.sum_lt_top_iffₓ'. -/
/-- A sum of finite numbers is still finite -/
-theorem sum_lt_top_iff [OrderedAddCommMonoid M] {s : Finset ι} {f : ι → WithTop M} :
+theorem sum_lt_top_iff [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M} :
(∑ i in s, f i) < ⊤ ↔ ∀ i ∈ s, f i < ⊤ := by
- simp only [lt_top_iff_ne_top, Ne.def, sum_eq_top_iff, not_exists]
+ simp only [WithTop.lt_top_iff_ne_top, Ne.def, sum_eq_top_iff, not_exists]
#align with_top.sum_lt_top_iff WithTop.sum_lt_top_iff
--/
+
+/- warning: with_top.sum_lt_top -> WithTop.sum_lt_top is a dubious translation:
+lean 3 declaration is
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : AddCommMonoid.{u2} M] [_inst_2 : LT.{u2} M] {s : Finset.{u1} ι} {f : ι -> (WithTop.{u2} M)}, (forall (i : ι), (Membership.Mem.{u1, u1} ι (Finset.{u1} ι) (Finset.hasMem.{u1} ι) i s) -> (Ne.{succ u2} (WithTop.{u2} M) (f i) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M)))) -> (LT.lt.{u2} (WithTop.{u2} M) (WithTop.hasLt.{u2} M _inst_2) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M _inst_1) s (fun (i : ι) => f i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.hasTop.{u2} M)))
+but is expected to have type
+ forall {ι : Type.{u1}} {M : Type.{u2}} [_inst_1 : OrderedAddCommMonoid.{u2} M] {_inst_2 : Finset.{u1} ι} {s : ι -> (WithTop.{u2} M)}, (forall (ᾰ : ι), (Membership.mem.{u1, u1} ι (Finset.{u1} ι) (Finset.instMembershipFinset.{u1} ι) ᾰ _inst_2) -> (Ne.{succ u2} (WithTop.{u2} M) (s ᾰ) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M)))) -> (LT.lt.{u2} (WithTop.{u2} M) (Preorder.toLT.{u2} (WithTop.{u2} M) (WithTop.preorder.{u2} M (PartialOrder.toPreorder.{u2} M (OrderedAddCommMonoid.toPartialOrder.{u2} M _inst_1)))) (Finset.sum.{u2, u1} (WithTop.{u2} M) ι (WithTop.addCommMonoid.{u2} M (OrderedAddCommMonoid.toAddCommMonoid.{u2} M _inst_1)) _inst_2 (fun (i : ι) => s i)) (Top.top.{u2} (WithTop.{u2} M) (WithTop.top.{u2} M)))
+Case conversion may be inaccurate. Consider using '#align with_top.sum_lt_top WithTop.sum_lt_topₓ'. -/
+/-- A sum of finite numbers is still finite -/
+theorem sum_lt_top [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M}
+ (h : ∀ i ∈ s, f i ≠ ⊤) : (∑ i in s, f i) < ⊤ :=
+ sum_lt_top_iff.2 fun i hi => WithTop.lt_top_iff_ne_top.2 (h i hi)
+#align with_top.sum_lt_top WithTop.sum_lt_top
end WithTop
@@ -1096,12 +1102,7 @@ but is expected to have type
Case conversion may be inaccurate. Consider using '#align absolute_value.sum_le AbsoluteValue.sum_leₓ'. -/
theorem AbsoluteValue.sum_le [Semiring R] [OrderedSemiring S] (abv : AbsoluteValue R S)
(s : Finset ι) (f : ι → R) : abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) :=
- by
- letI := Classical.decEq ι
- refine' Finset.induction_on s _ fun i s hi ih => _
- · simp
- · simp only [Finset.sum_insert hi]
- exact (abv.add_le _ _).trans (add_le_add le_rfl ih)
+ Finset.le_sum_of_subadditive abv (map_zero _) abv.add_le _ _
#align absolute_value.sum_le AbsoluteValue.sum_le
/- warning: is_absolute_value.abv_sum -> IsAbsoluteValue.abv_sum is a dubious translation:
mathlib commit https://github.com/leanprover-community/mathlib/commit/bd9851ca476957ea4549eb19b40e7b5ade9428cc
These are changes from #11997, the latest adaptation PR for nightly-2024-04-07, which can be made directly on master.
Co-authored-by: Scott Morrison <scott.morrison@gmail.com> Co-authored-by: Ruben Van de Velde <65514131+Ruben-VandeVelde@users.noreply.github.com>
@@ -659,7 +659,7 @@ theorem finset_sum_eq_sup_iff_disjoint [DecidableEq α] {β : Type*} {i : Finset
· simp only [Finset.not_mem_empty, IsEmpty.forall_iff, imp_true_iff, Finset.sum_empty,
Finset.sup_empty, bot_eq_zero, eq_self_iff_true]
· simp_rw [Finset.sum_cons hz, Finset.sup_cons, Finset.mem_cons, Multiset.sup_eq_union,
- forall_eq_or_imp, Ne.def, not_true_eq_false, IsEmpty.forall_iff, true_and_iff,
+ forall_eq_or_imp, Ne, not_true_eq_false, IsEmpty.forall_iff, true_and_iff,
imp_and, forall_and, ← hr, @eq_comm _ z]
have := fun x (H : x ∈ i) => ne_of_mem_of_not_mem H hz
simp (config := { contextual := true }) only [this, not_false_iff, true_imp_iff]
Purely automatic replacement. If this is in any way controversial; I'm happy to just close this PR.
@@ -396,7 +396,7 @@ variable [CanonicallyOrderedCommMonoid M] {f : ι → M} {s t : Finset ι}
/-- In a canonically-ordered monoid, a product bounds each of its terms.
-See also `Finset.single_le_prod'`.-/
+See also `Finset.single_le_prod'`. -/
@[to_additive "In a canonically-ordered additive monoid, a sum bounds each of its terms.
See also `Finset.single_le_sum`."]
Take the content of
Algebra.BigOperators.List.Basic
Algebra.BigOperators.List.Lemmas
Algebra.BigOperators.Multiset.Basic
Algebra.BigOperators.Multiset.Lemmas
Algebra.BigOperators.Multiset.Order
Algebra.BigOperators.Order
and sort it into six files:
Algebra.Order.BigOperators.Group.List
. I credit Yakov for https://github.com/leanprover-community/mathlib/pull/8543.Algebra.Order.BigOperators.Group.Multiset
. Copyright inherited from Algebra.BigOperators.Multiset.Order
.Algebra.Order.BigOperators.Group.Finset
. Copyright inherited from Algebra.BigOperators.Order
.Algebra.Order.BigOperators.Ring.List
. I credit Stuart for https://github.com/leanprover-community/mathlib/pull/10184.Algebra.Order.BigOperators.Ring.Multiset
. I credit Ruben for https://github.com/leanprover-community/mathlib/pull/8787.Algebra.Order.BigOperators.Ring.Finset
. I credit Floris for https://github.com/leanprover-community/mathlib/pull/1294.Here are the design decisions at play:
Data.Nat.Order.Basic
in a few List
files.Algebra.Order.BigOperators
instead of Algebra.BigOperators.Order
because algebraic order theory is more of a theory than big operators algebra. Another reason is that algebraic order theory is the only way to mix pure order and pure algebra, while there are more ways to mix pure finiteness and pure algebra than just big operators.Algebra.Order.BigOperators.Group
should be additivisable (except a few Nat
- or Int
-specific lemmas). In contrast, things under Algebra.Order.BigOperators.Ring
are more prone to having heavy imports.List
vs Multiset
vs Finset
. This is not strictly necessary, and can be relaxed in cases where there aren't that many lemmas to be had. As an example, I could split out the AbsoluteValue
lemmas from Algebra.Order.BigOperators.Ring.Finset
to a file Algebra.Order.BigOperators.Ring.AbsoluteValue
and it could stay this way until too many lemmas are in this file (or a split is needed for import reasons), in which case we would need files Algebra.Order.BigOperators.Ring.AbsoluteValue.Finset
, Algebra.Order.BigOperators.Ring.AbsoluteValue.Multiset
, etc...Finsupp
big operator and finprod
/finsum
order lemmas also belong in Algebra.Order.BigOperators
. I haven't done so in this PR because the diff is big enough like that.@@ -3,18 +3,18 @@ Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
-/
-import Mathlib.Algebra.BigOperators.Ring
-import Mathlib.Algebra.Order.AbsoluteValue
-import Mathlib.Tactic.GCongr.Core
-import Mathlib.Tactic.Ring
+import Mathlib.Algebra.BigOperators.Basic
+import Mathlib.Algebra.Order.BigOperators.Group.Multiset
+import Mathlib.Tactic.NormNum.Basic
+import Mathlib.Tactic.Positivity.Core
#align_import algebra.big_operators.order from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
/-!
-# Results about big operators with values in an ordered algebraic structure.
-
-Mostly monotonicity results for the `∏` and `∑` operations.
+# Big operators on a finset in ordered groups
+This file contains the results concerning the interaction of multiset big operators with ordered
+groups/monoids.
-/
open Function
@@ -275,11 +275,6 @@ theorem abs_sum_of_nonneg' {G : Type*} [LinearOrderedAddCommGroup G] {f : ι →
rw [abs_of_nonneg (Finset.sum_nonneg' hf)]
#align finset.abs_sum_of_nonneg' Finset.abs_sum_of_nonneg'
-theorem abs_prod {R : Type*} [LinearOrderedCommRing R] {f : ι → R} {s : Finset ι} :
- |∏ x in s, f x| = ∏ x in s, |f x| :=
- map_prod absHom _ _
-#align finset.abs_prod Finset.abs_prod
-
section Pigeonhole
variable [DecidableEq β]
@@ -597,160 +592,6 @@ theorem exists_one_lt_of_prod_one_of_exists_ne_one' (f : ι → M) (h₁ : ∏ i
end LinearOrderedCancelCommMonoid
-section CommMonoidWithZero
-variable [CommMonoidWithZero R] [PartialOrder R] [ZeroLEOneClass R]
-
-section PosMulMono
-variable [PosMulMono R] {f g : ι → R} {s t : Finset ι}
-
-theorem prod_nonneg (h0 : ∀ i ∈ s, 0 ≤ f i) : 0 ≤ ∏ i in s, f i :=
- prod_induction f (fun i ↦ 0 ≤ i) (fun _ _ ha hb ↦ mul_nonneg ha hb) zero_le_one h0
-#align finset.prod_nonneg Finset.prod_nonneg
-
-/-- If all `f i`, `i ∈ s`, are nonnegative and each `f i` is less than or equal to `g i`, then the
-product of `f i` is less than or equal to the product of `g i`. See also `Finset.prod_le_prod'` for
-the case of an ordered commutative multiplicative monoid. -/
-theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g i) :
- ∏ i in s, f i ≤ ∏ i in s, g i := by
- induction' s using Finset.cons_induction with a s has ih h
- · simp
- · simp only [prod_cons]
- have := posMulMono_iff_mulPosMono.1 ‹PosMulMono R›
- apply mul_le_mul
- · exact h1 a (mem_cons_self a s)
- · refine ih (fun x H ↦ h0 _ ?_) (fun x H ↦ h1 _ ?_) <;> exact subset_cons _ H
- · apply prod_nonneg fun x H ↦ h0 x (subset_cons _ H)
- · apply le_trans (h0 a (mem_cons_self a s)) (h1 a (mem_cons_self a s))
-#align finset.prod_le_prod Finset.prod_le_prod
-
-/-- If all `f i`, `i ∈ s`, are nonnegative and each `f i` is less than or equal to `g i`, then the
-product of `f i` is less than or equal to the product of `g i`.
-
-This is a variant (beta-reduced) version of the standard lemma `Finset.prod_le_prod`, convenient
-for the `gcongr` tactic. -/
-@[gcongr]
-theorem _root_.GCongr.prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g i) :
- s.prod f ≤ s.prod g :=
- s.prod_le_prod h0 h1
-
-/-- If each `f i`, `i ∈ s` belongs to `[0, 1]`, then their product is less than or equal to one.
-See also `Finset.prod_le_one'` for the case of an ordered commutative multiplicative monoid. -/
-theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1) : ∏ i in s, f i ≤ 1 := by
- convert ← prod_le_prod h0 h1
- exact Finset.prod_const_one
-#align finset.prod_le_one Finset.prod_le_one
-
-end PosMulMono
-
-section PosMulStrictMono
-variable [PosMulStrictMono R] [Nontrivial R] {f g : ι → R} {s t : Finset ι}
-
-theorem prod_pos (h0 : ∀ i ∈ s, 0 < f i) : 0 < ∏ i in s, f i :=
- prod_induction f (fun x ↦ 0 < x) (fun _ _ ha hb ↦ mul_pos ha hb) zero_lt_one h0
-#align finset.prod_pos Finset.prod_pos
-
-theorem prod_lt_prod (hf : ∀ i ∈ s, 0 < f i) (hfg : ∀ i ∈ s, f i ≤ g i)
- (hlt : ∃ i ∈ s, f i < g i) :
- ∏ i in s, f i < ∏ i in s, g i := by
- classical
- obtain ⟨i, hi, hilt⟩ := hlt
- rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
- have := posMulStrictMono_iff_mulPosStrictMono.1 ‹PosMulStrictMono R›
- refine mul_lt_mul_of_le_of_lt' hilt ?_ ?_ ?_
- · exact prod_le_prod (fun j hj => le_of_lt (hf j (mem_of_mem_erase hj)))
- (fun _ hj ↦ hfg _ <| mem_of_mem_erase hj)
- · exact (hf i hi).le.trans hilt.le
- · exact prod_pos fun j hj => hf j (mem_of_mem_erase hj)
-
-theorem prod_lt_prod_of_nonempty (hf : ∀ i ∈ s, 0 < f i) (hfg : ∀ i ∈ s, f i < g i)
- (h_ne : s.Nonempty) :
- ∏ i in s, f i < ∏ i in s, g i := by
- apply prod_lt_prod hf fun i hi => le_of_lt (hfg i hi)
- obtain ⟨i, hi⟩ := h_ne
- exact ⟨i, hi, hfg i hi⟩
-
-end PosMulStrictMono
-end CommMonoidWithZero
-
-section StrictOrderedCommSemiring
-
-end StrictOrderedCommSemiring
-
-section OrderedCommSemiring
-variable [OrderedCommSemiring R] {f g : ι → R} {s t : Finset ι}
-
-/-- If `g, h ≤ f` and `g i + h i ≤ f i`, then the product of `f` over `s` is at least the
- sum of the products of `g` and `h`. This is the version for `OrderedCommSemiring`. -/
-lemma prod_add_prod_le {i : ι} {f g h : ι → R} (hi : i ∈ s) (h2i : g i + h i ≤ f i)
- (hgf : ∀ j ∈ s, j ≠ i → g j ≤ f j) (hhf : ∀ j ∈ s, j ≠ i → h j ≤ f j) (hg : ∀ i ∈ s, 0 ≤ g i)
- (hh : ∀ i ∈ s, 0 ≤ h i) : ((∏ i in s, g i) + ∏ i in s, h i) ≤ ∏ i in s, f i := by
- classical
- simp_rw [prod_eq_mul_prod_diff_singleton hi]
- refine le_trans ?_ (mul_le_mul_of_nonneg_right h2i ?_)
- · rw [right_distrib]
- refine add_le_add ?_ ?_ <;>
- · refine mul_le_mul_of_nonneg_left ?_ ?_
- · refine prod_le_prod ?_ ?_ <;> simp (config := { contextual := true }) [*]
- · try apply_assumption
- try assumption
- · apply prod_nonneg
- simp only [and_imp, mem_sdiff, mem_singleton]
- exact fun j hj hji ↦ le_trans (hg j hj) (hgf j hj hji)
-#align finset.prod_add_prod_le Finset.prod_add_prod_le
-
-end OrderedCommSemiring
-
-section LinearOrderedCommSemiring
-variable [LinearOrderedCommSemiring α] [ExistsAddOfLE α]
-
-/-- **Cauchy-Schwarz inequality** for finsets. -/
-lemma sum_mul_sq_le_sq_mul_sq (s : Finset ι) (f g : ι → α) :
- (∑ i in s, f i * g i) ^ 2 ≤ (∑ i in s, f i ^ 2) * ∑ i in s, g i ^ 2 := by
- nontriviality α
- obtain h' | h' := (sum_nonneg fun _ _ ↦ sq_nonneg <| g _).eq_or_lt
- · have h'' : ∀ i ∈ s, g i = 0 := fun i hi ↦ by
- simpa using (sum_eq_zero_iff_of_nonneg fun i _ ↦ sq_nonneg (g i)).1 h'.symm i hi
- rw [← h', sum_congr rfl (show ∀ i ∈ s, f i * g i = 0 from fun i hi ↦ by simp [h'' i hi])]
- simp
- refine le_of_mul_le_mul_of_pos_left
- (le_of_add_le_add_left (a := (∑ i in s, g i ^ 2) * (∑ j in s, f j * g j) ^ 2) ?_) h'
- calc
- _ = ∑ i in s, 2 * (f i * ∑ j in s, g j ^ 2) * (g i * ∑ j in s, f j * g j) := by
- simp_rw [mul_assoc (2 : α), mul_mul_mul_comm, ← mul_sum, ← sum_mul]; ring
- _ ≤ ∑ i in s, ((f i * ∑ j in s, g j ^ 2) ^ 2 + (g i * ∑ j in s, f j * g j) ^ 2) :=
- sum_le_sum fun i _ ↦ two_mul_le_add_sq (f i * ∑ j in s, g j ^ 2) (g i * ∑ j in s, f j * g j)
- _ = _ := by simp_rw [sum_add_distrib, mul_pow, ← sum_mul]; ring
-
-end LinearOrderedCommSemiring
-
-section CanonicallyOrderedCommSemiring
-
-variable [CanonicallyOrderedCommSemiring R] {f g h : ι → R} {s : Finset ι} {i : ι}
-
-/-- Note that the name is to match `CanonicallyOrderedCommSemiring.mul_pos`. -/
-@[simp] lemma _root_.CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
- 0 < ∏ i in s, f i ↔ (∀ i ∈ s, (0 : R) < f i) :=
- CanonicallyOrderedCommSemiring.multiset_prod_pos.trans Multiset.forall_mem_map_iff
-#align canonically_ordered_comm_semiring.prod_pos CanonicallyOrderedCommSemiring.prod_pos
-
-/-- If `g, h ≤ f` and `g i + h i ≤ f i`, then the product of `f` over `s` is at least the
- sum of the products of `g` and `h`. This is the version for `CanonicallyOrderedCommSemiring`.
--/
-theorem prod_add_prod_le' (hi : i ∈ s) (h2i : g i + h i ≤ f i) (hgf : ∀ j ∈ s, j ≠ i → g j ≤ f j)
- (hhf : ∀ j ∈ s, j ≠ i → h j ≤ f j) : ((∏ i in s, g i) + ∏ i in s, h i) ≤ ∏ i in s, f i := by
- classical
- simp_rw [prod_eq_mul_prod_diff_singleton hi]
- refine' le_trans _ (mul_le_mul_right' h2i _)
- rw [right_distrib]
- apply add_le_add <;> apply mul_le_mul_left' <;> apply prod_le_prod' <;>
- simp only [and_imp, mem_sdiff, mem_singleton] <;>
- intros <;>
- apply_assumption <;>
- assumption
-#align finset.prod_add_prod_le' Finset.prod_add_prod_le'
-
-end CanonicallyOrderedCommSemiring
-
end Finset
namespace Fintype
@@ -808,36 +649,34 @@ lemma prod_lt_one_iff_of_le_one (hf : f ≤ 1) : ∏ i, f i < 1 ↔ f < 1 := by
end OrderedCancelCommMonoid
end Fintype
-section AbsoluteValue
-
-variable {S : Type*}
-
-theorem AbsoluteValue.sum_le [Semiring R] [OrderedSemiring S] (abv : AbsoluteValue R S)
- (s : Finset ι) (f : ι → R) : abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) :=
- Finset.le_sum_of_subadditive abv (map_zero _) abv.add_le _ _
-#align absolute_value.sum_le AbsoluteValue.sum_le
-
-theorem IsAbsoluteValue.abv_sum [Semiring R] [OrderedSemiring S] (abv : R → S) [IsAbsoluteValue abv]
- (f : ι → R) (s : Finset ι) : abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) :=
- (IsAbsoluteValue.toAbsoluteValue abv).sum_le _ _
-#align is_absolute_value.abv_sum IsAbsoluteValue.abv_sum
-
--- 2024-02-14
-@[deprecated] alias abv_sum_le_sum_abv := IsAbsoluteValue.abv_sum
-
-nonrec theorem AbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedCommRing S]
- (abv : AbsoluteValue R S) (f : ι → R) (s : Finset ι) :
- abv (∏ i in s, f i) = ∏ i in s, abv (f i) :=
- map_prod abv f s
-#align absolute_value.map_prod AbsoluteValue.map_prod
-
-theorem IsAbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedCommRing S]
- (abv : R → S) [IsAbsoluteValue abv] (f : ι → R) (s : Finset ι) :
- abv (∏ i in s, f i) = ∏ i in s, abv (f i) :=
- (IsAbsoluteValue.toAbsoluteValue abv).map_prod _ _
-#align is_absolute_value.map_prod IsAbsoluteValue.map_prod
+namespace Multiset
+
+theorem finset_sum_eq_sup_iff_disjoint [DecidableEq α] {β : Type*} {i : Finset β}
+ {f : β → Multiset α} :
+ i.sum f = i.sup f ↔
+ ∀ᵉ (x ∈ i) (y ∈ i), x ≠ y → Multiset.Disjoint (f x) (f y) := by
+ induction' i using Finset.cons_induction_on with z i hz hr
+ · simp only [Finset.not_mem_empty, IsEmpty.forall_iff, imp_true_iff, Finset.sum_empty,
+ Finset.sup_empty, bot_eq_zero, eq_self_iff_true]
+ · simp_rw [Finset.sum_cons hz, Finset.sup_cons, Finset.mem_cons, Multiset.sup_eq_union,
+ forall_eq_or_imp, Ne.def, not_true_eq_false, IsEmpty.forall_iff, true_and_iff,
+ imp_and, forall_and, ← hr, @eq_comm _ z]
+ have := fun x (H : x ∈ i) => ne_of_mem_of_not_mem H hz
+ simp (config := { contextual := true }) only [this, not_false_iff, true_imp_iff]
+ simp_rw [← disjoint_finset_sum_left, ← disjoint_finset_sum_right, disjoint_comm, ← and_assoc,
+ and_self_iff]
+ exact add_eq_union_left_of_le (Finset.sup_le fun x hx => le_sum_of_mem (mem_map_of_mem f hx))
+#align multiset.finset_sum_eq_sup_iff_disjoint Multiset.finset_sum_eq_sup_iff_disjoint
+
+theorem sup_powerset_len {α : Type*} [DecidableEq α] (x : Multiset α) :
+ (Finset.sup (Finset.range (card x + 1)) fun k => x.powersetCard k) = x.powerset := by
+ convert bind_powerset_len x using 1
+ rw [Multiset.bind, Multiset.join, ← Finset.range_val, ← Finset.sum_eq_multiset_sum]
+ exact
+ Eq.symm (finset_sum_eq_sup_iff_disjoint.mpr fun _ _ _ _ h => pairwise_disjoint_powersetCard x h)
+#align multiset.sup_powerset_len Multiset.sup_powerset_len
-end AbsoluteValue
+end Multiset
namespace Mathlib.Meta.Positivity
open Qq Lean Meta Finset
Finset.preimage
not depend on Finset.sum
(#11601)
and Data.Finset.LocallyFinite
not depend on Finset.sum
too
@@ -854,7 +854,7 @@ because `compareHyp` can't look for assumptions behind binders.
@[positivity Finset.sum _ _]
def evalFinsetSum : PositivityExt where eval {u α} zα pα e := do
match e with
- | ~q(@Finset.sum _ $ι $instα $s $f) =>
+ | ~q(@Finset.sum $ι _ $instα $s $f) =>
let i : Q($ι) ← mkFreshExprMVarQ q($ι) .syntheticOpaque
have body : Q($α) := .betaRev f #[i]
let rbody ← core zα pα body
@@ -399,6 +399,16 @@ section CanonicallyOrderedCommMonoid
variable [CanonicallyOrderedCommMonoid M] {f : ι → M} {s t : Finset ι}
+/-- In a canonically-ordered monoid, a product bounds each of its terms.
+
+See also `Finset.single_le_prod'`.-/
+@[to_additive "In a canonically-ordered additive monoid, a sum bounds each of its terms.
+
+See also `Finset.single_le_sum`."]
+lemma _root_.CanonicallyOrderedCommMonoid.single_le_prod {i : ι} (hi : i ∈ s) :
+ f i ≤ ∏ j in s, f j :=
+ single_le_prod' (fun _ _ ↦ one_le _) hi
+
@[to_additive (attr := simp) sum_eq_zero_iff]
theorem prod_eq_one_iff' : ∏ x in s, f x = 1 ↔ ∀ x ∈ s, f x = 1 :=
prod_eq_one_iff_of_one_le' fun x _ ↦ one_le (f x)
λ
by fun
(#11301)
Per the style guidelines, λ
is disallowed in mathlib.
This is close to exhaustive; I left some tactic code alone when it seemed to me that tactic could be upstreamed soon.
Notes
=>
to ↦
.Mathlib/Order/SupClosed
.λ x,
, which I also replaced.@@ -754,9 +754,9 @@ theorem prod_mono' : Monotone fun f : ι → M ↦ ∏ i, f i := fun _ _ hfg ↦
#align fintype.sum_mono Fintype.sum_mono
@[to_additive sum_nonneg]
-lemma one_le_prod (hf : 1 ≤ f) : 1 ≤ ∏ i, f i := Finset.one_le_prod' λ _ _ ↦ hf _
+lemma one_le_prod (hf : 1 ≤ f) : 1 ≤ ∏ i, f i := Finset.one_le_prod' fun _ _ ↦ hf _
-@[to_additive] lemma prod_le_one (hf : f ≤ 1) : ∏ i, f i ≤ 1 := Finset.prod_le_one' λ _ _ ↦ hf _
+@[to_additive] lemma prod_le_one (hf : f ≤ 1) : ∏ i, f i ≤ 1 := Finset.prod_le_one' fun _ _ ↦ hf _
@[to_additive]
lemma prod_eq_one_iff_of_one_le (hf : 1 ≤ f) : ∏ i, f i = 1 ↔ f = 1 :=
@@ -781,11 +781,11 @@ theorem prod_strictMono' : StrictMono fun f : ι → M ↦ ∏ x, f x :=
@[to_additive sum_pos]
lemma one_lt_prod (hf : 1 < f) : 1 < ∏ i, f i :=
- Finset.one_lt_prod' (λ _ _ ↦ hf.le _) <| by simpa using (Pi.lt_def.1 hf).2
+ Finset.one_lt_prod' (fun _ _ ↦ hf.le _) <| by simpa using (Pi.lt_def.1 hf).2
@[to_additive]
lemma prod_lt_one (hf : f < 1) : ∏ i, f i < 1 :=
- Finset.prod_lt_one' (λ _ _ ↦ hf.le _) <| by simpa using (Pi.lt_def.1 hf).2
+ Finset.prod_lt_one' (fun _ _ ↦ hf.le _) <| by simpa using (Pi.lt_def.1 hf).2
@[to_additive sum_pos_iff_of_nonneg]
lemma one_lt_prod_iff_of_one_le (hf : 1 ≤ f) : 1 < ∏ i, f i ↔ 1 < f := by
@@ -176,7 +176,7 @@ theorem prod_le_univ_prod_of_one_le' [Fintype ι] {s : Finset ι} (w : ∀ x, 1
#align finset.prod_le_univ_prod_of_one_le' Finset.prod_le_univ_prod_of_one_le'
#align finset.sum_le_univ_sum_of_nonneg Finset.sum_le_univ_sum_of_nonneg
--- Porting Note: TODO -- The two next lemmas give the same lemma in additive version
+-- Porting note (#11215): TODO -- The two next lemmas give the same lemma in additive version
@[to_additive sum_eq_zero_iff_of_nonneg]
theorem prod_eq_one_iff_of_one_le' :
(∀ i ∈ s, 1 ≤ f i) → ((∏ i in s, f i) = 1 ↔ ∀ i ∈ s, f i = 1) := by
@@ -471,7 +471,7 @@ This is a variant (beta-reduced) version of the standard lemma `Finset.sum_lt_su
convenient for the `gcongr` tactic. -/
add_decl_doc GCongr.sum_lt_sum_of_nonempty
--- Porting note: TODO -- calc indentation
+-- Porting note (#11215): TODO -- calc indentation
@[to_additive sum_lt_sum_of_subset]
theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i ∉ s) (hlt : 1 < f i)
(hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : ∏ j in s, f j < ∏ j in t, f j := by
@@ -587,13 +587,12 @@ theorem exists_one_lt_of_prod_one_of_exists_ne_one' (f : ι → M) (h₁ : ∏ i
end LinearOrderedCancelCommMonoid
-section OrderedCommSemiring
-
-variable [OrderedCommSemiring R] {f g : ι → R} {s t : Finset ι}
+section CommMonoidWithZero
+variable [CommMonoidWithZero R] [PartialOrder R] [ZeroLEOneClass R]
-open Classical
+section PosMulMono
+variable [PosMulMono R] {f g : ι → R} {s t : Finset ι}
--- this is also true for an ordered commutative multiplicative monoid with zero
theorem prod_nonneg (h0 : ∀ i ∈ s, 0 ≤ f i) : 0 ≤ ∏ i in s, f i :=
prod_induction f (fun i ↦ 0 ≤ i) (fun _ _ ha hb ↦ mul_nonneg ha hb) zero_le_one h0
#align finset.prod_nonneg Finset.prod_nonneg
@@ -603,14 +602,15 @@ product of `f i` is less than or equal to the product of `g i`. See also `Finset
the case of an ordered commutative multiplicative monoid. -/
theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g i) :
∏ i in s, f i ≤ ∏ i in s, g i := by
- induction' s using Finset.induction with a s has ih h
+ induction' s using Finset.cons_induction with a s has ih h
· simp
- · simp only [prod_insert has]
+ · simp only [prod_cons]
+ have := posMulMono_iff_mulPosMono.1 ‹PosMulMono R›
apply mul_le_mul
- · exact h1 a (mem_insert_self a s)
- · refine ih (fun x H ↦ h0 _ ?_) (fun x H ↦ h1 _ ?_) <;> exact mem_insert_of_mem H
- · apply prod_nonneg fun x H ↦ h0 x (mem_insert_of_mem H)
- · apply le_trans (h0 a (mem_insert_self a s)) (h1 a (mem_insert_self a s))
+ · exact h1 a (mem_cons_self a s)
+ · refine ih (fun x H ↦ h0 _ ?_) (fun x H ↦ h1 _ ?_) <;> exact subset_cons _ H
+ · apply prod_nonneg fun x H ↦ h0 x (subset_cons _ H)
+ · apply le_trans (h0 a (mem_cons_self a s)) (h1 a (mem_cons_self a s))
#align finset.prod_le_prod Finset.prod_le_prod
/-- If all `f i`, `i ∈ s`, are nonnegative and each `f i` is less than or equal to `g i`, then the
@@ -630,33 +630,11 @@ theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1)
exact Finset.prod_const_one
#align finset.prod_le_one Finset.prod_le_one
-/-- If `g, h ≤ f` and `g i + h i ≤ f i`, then the product of `f` over `s` is at least the
- sum of the products of `g` and `h`. This is the version for `OrderedCommSemiring`. -/
-theorem prod_add_prod_le {i : ι} {f g h : ι → R} (hi : i ∈ s) (h2i : g i + h i ≤ f i)
- (hgf : ∀ j ∈ s, j ≠ i → g j ≤ f j) (hhf : ∀ j ∈ s, j ≠ i → h j ≤ f j) (hg : ∀ i ∈ s, 0 ≤ g i)
- (hh : ∀ i ∈ s, 0 ≤ h i) : ((∏ i in s, g i) + ∏ i in s, h i) ≤ ∏ i in s, f i := by
- simp_rw [prod_eq_mul_prod_diff_singleton hi]
- refine le_trans ?_ (mul_le_mul_of_nonneg_right h2i ?_)
- · rw [right_distrib]
- refine add_le_add ?_ ?_ <;>
- · refine mul_le_mul_of_nonneg_left ?_ ?_
- · refine prod_le_prod ?_ ?_
- <;> simp (config := { contextual := true }) [*]
- · try apply_assumption
- try assumption
- · apply prod_nonneg
- simp only [and_imp, mem_sdiff, mem_singleton]
- intro j h1j h2j
- exact le_trans (hg j h1j) (hgf j h1j h2j)
-#align finset.prod_add_prod_le Finset.prod_add_prod_le
+end PosMulMono
-end OrderedCommSemiring
+section PosMulStrictMono
+variable [PosMulStrictMono R] [Nontrivial R] {f g : ι → R} {s t : Finset ι}
-section StrictOrderedCommSemiring
-
-variable [StrictOrderedCommSemiring R] {f g : ι → R} {s : Finset ι}
-
--- This is also true for an ordered commutative multiplicative monoid with zero
theorem prod_pos (h0 : ∀ i ∈ s, 0 < f i) : 0 < ∏ i in s, f i :=
prod_induction f (fun x ↦ 0 < x) (fun _ _ ha hb ↦ mul_pos ha hb) zero_lt_one h0
#align finset.prod_pos Finset.prod_pos
@@ -667,11 +645,12 @@ theorem prod_lt_prod (hf : ∀ i ∈ s, 0 < f i) (hfg : ∀ i ∈ s, f i ≤ g i
classical
obtain ⟨i, hi, hilt⟩ := hlt
rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
- apply mul_lt_mul hilt
+ have := posMulStrictMono_iff_mulPosStrictMono.1 ‹PosMulStrictMono R›
+ refine mul_lt_mul_of_le_of_lt' hilt ?_ ?_ ?_
· exact prod_le_prod (fun j hj => le_of_lt (hf j (mem_of_mem_erase hj)))
(fun _ hj ↦ hfg _ <| mem_of_mem_erase hj)
+ · exact (hf i hi).le.trans hilt.le
· exact prod_pos fun j hj => hf j (mem_of_mem_erase hj)
- · exact le_of_lt <| (hf i hi).trans hilt
theorem prod_lt_prod_of_nonempty (hf : ∀ i ∈ s, 0 < f i) (hfg : ∀ i ∈ s, f i < g i)
(h_ne : s.Nonempty) :
@@ -680,8 +659,37 @@ theorem prod_lt_prod_of_nonempty (hf : ∀ i ∈ s, 0 < f i) (hfg : ∀ i ∈ s,
obtain ⟨i, hi⟩ := h_ne
exact ⟨i, hi, hfg i hi⟩
+end PosMulStrictMono
+end CommMonoidWithZero
+
+section StrictOrderedCommSemiring
+
end StrictOrderedCommSemiring
+section OrderedCommSemiring
+variable [OrderedCommSemiring R] {f g : ι → R} {s t : Finset ι}
+
+/-- If `g, h ≤ f` and `g i + h i ≤ f i`, then the product of `f` over `s` is at least the
+ sum of the products of `g` and `h`. This is the version for `OrderedCommSemiring`. -/
+lemma prod_add_prod_le {i : ι} {f g h : ι → R} (hi : i ∈ s) (h2i : g i + h i ≤ f i)
+ (hgf : ∀ j ∈ s, j ≠ i → g j ≤ f j) (hhf : ∀ j ∈ s, j ≠ i → h j ≤ f j) (hg : ∀ i ∈ s, 0 ≤ g i)
+ (hh : ∀ i ∈ s, 0 ≤ h i) : ((∏ i in s, g i) + ∏ i in s, h i) ≤ ∏ i in s, f i := by
+ classical
+ simp_rw [prod_eq_mul_prod_diff_singleton hi]
+ refine le_trans ?_ (mul_le_mul_of_nonneg_right h2i ?_)
+ · rw [right_distrib]
+ refine add_le_add ?_ ?_ <;>
+ · refine mul_le_mul_of_nonneg_left ?_ ?_
+ · refine prod_le_prod ?_ ?_ <;> simp (config := { contextual := true }) [*]
+ · try apply_assumption
+ try assumption
+ · apply prod_nonneg
+ simp only [and_imp, mem_sdiff, mem_singleton]
+ exact fun j hj hji ↦ le_trans (hg j hj) (hgf j hj hji)
+#align finset.prod_add_prod_le Finset.prod_add_prod_le
+
+end OrderedCommSemiring
+
section LinearOrderedCommSemiring
variable [LinearOrderedCommSemiring α] [ExistsAddOfLE α]
Finset.sum
(#10538)
Also define a new aesop
rule-set and an auxiliary metaprogram proveFinsetNonempty
for dealing with Finset.Nonempty
conditions.
From LeanAPAP
Co-authored-by: Alex J. Best <alex.j.best@gmail.com>
Co-authored-by: Eric Wieser <wieser.eric@gmail.com> Co-authored-by: Alex J Best <alex.j.best@gmail.com>
@@ -820,3 +820,43 @@ theorem IsAbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedC
#align is_absolute_value.map_prod IsAbsoluteValue.map_prod
end AbsoluteValue
+
+namespace Mathlib.Meta.Positivity
+open Qq Lean Meta Finset
+
+/-- The `positivity` extension which proves that `∑ i in s, f i` is nonnegative if `f` is, and
+positive if each `f i` is and `s` is nonempty.
+
+TODO: The following example does not work
+```
+example (s : Finset ℕ) (f : ℕ → ℤ) (hf : ∀ n, 0 ≤ f n) : 0 ≤ s.sum f := by positivity
+```
+because `compareHyp` can't look for assumptions behind binders.
+-/
+@[positivity Finset.sum _ _]
+def evalFinsetSum : PositivityExt where eval {u α} zα pα e := do
+ match e with
+ | ~q(@Finset.sum _ $ι $instα $s $f) =>
+ let i : Q($ι) ← mkFreshExprMVarQ q($ι) .syntheticOpaque
+ have body : Q($α) := .betaRev f #[i]
+ let rbody ← core zα pα body
+ let p_pos : Option Q(0 < $e) := ← (do
+ let .positive pbody := rbody | pure none -- Fail if the body is not provably positive
+ let .some ps ← proveFinsetNonempty s | pure none
+ let .some pα' ← trySynthInstanceQ q(OrderedCancelAddCommMonoid $α) | pure none
+ assertInstancesCommute
+ let pr : Q(∀ i, 0 < $f i) ← mkLambdaFVars #[i] pbody
+ return some q(@sum_pos $ι $α $pα' $f $s (fun i _ ↦ $pr i) $ps))
+ -- Try to show that the sum is positive
+ if let some p_pos := p_pos then
+ return .positive p_pos
+ -- Fall back to showing that the sum is nonnegative
+ else
+ let pbody ← rbody.toNonneg
+ let pr : Q(∀ i, 0 ≤ $f i) ← mkLambdaFVars #[i] pbody
+ let pα' ← synthInstanceQ q(OrderedAddCommMonoid $α)
+ assertInstancesCommute
+ return .nonnegative q(@sum_nonneg $ι $α $pα' $f $s fun i _ ↦ $pr i)
+ | _ => throwError "not Finset.sum"
+
+end Mathlib.Meta.Positivity
Data.Real.CauSeq
to Algebra.Order.CauSeq.Basic
Data.Real.CauSeqCompletion
to Algebra.Order.CauSeq.Completion
CauSeq
from Data.Complex.Exponential
to a new file Algebra.Order.CauSeq.BigOperators
Module
from Algebra.BigOperators.Intervals
to a new file Algebra.BigOperators.Module
abv_sum_le_sum_abv
as it's a duplicate of IsAbsoluteValue.abv_sum
@@ -804,6 +804,9 @@ theorem IsAbsoluteValue.abv_sum [Semiring R] [OrderedSemiring S] (abv : R → S)
(IsAbsoluteValue.toAbsoluteValue abv).sum_le _ _
#align is_absolute_value.abv_sum IsAbsoluteValue.abv_sum
+-- 2024-02-14
+@[deprecated] alias abv_sum_le_sum_abv := IsAbsoluteValue.abv_sum
+
nonrec theorem AbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedCommRing S]
(abv : AbsoluteValue R S) (f : ι → R) (s : Finset ι) :
abv (∏ i in s, f i) = ∏ i in s, abv (f i) :=
@@ -685,6 +685,7 @@ end StrictOrderedCommSemiring
section LinearOrderedCommSemiring
variable [LinearOrderedCommSemiring α] [ExistsAddOfLE α]
+/-- **Cauchy-Schwarz inequality** for finsets. -/
lemma sum_mul_sq_le_sq_mul_sq (s : Finset ι) (f g : ι → α) :
(∑ i in s, f i * g i) ^ 2 ≤ (∑ i in s, f i ^ 2) * ∑ i in s, g i ^ 2 := by
nontriviality α
WithTop
lemmas (#10239)
from Algebra.BigOperators.Order
. Add the corresponding WithBot
lemmas.
@@ -3,10 +3,8 @@ Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
-/
-import Mathlib.Algebra.Order.AbsoluteValue
-import Mathlib.Algebra.Order.Ring.WithTop
import Mathlib.Algebra.BigOperators.Ring
-import Mathlib.Data.Fintype.Card
+import Mathlib.Algebra.Order.AbsoluteValue
import Mathlib.Tactic.GCongr.Core
import Mathlib.Tactic.Ring
@@ -791,37 +789,6 @@ lemma prod_lt_one_iff_of_le_one (hf : f ≤ 1) : ∏ i, f i < 1 ↔ f < 1 := by
end OrderedCancelCommMonoid
end Fintype
-namespace WithTop
-
-open Finset
-
-/-- A product of finite numbers is still finite -/
-theorem prod_lt_top [CommMonoidWithZero R] [NoZeroDivisors R] [Nontrivial R] [DecidableEq R] [LT R]
- {s : Finset ι} {f : ι → WithTop R} (h : ∀ i ∈ s, f i ≠ ⊤) : ∏ i in s, f i < ⊤ :=
- prod_induction f (fun a ↦ a < ⊤) (fun _ _ h₁ h₂ ↦ mul_lt_top' h₁ h₂) (coe_lt_top 1)
- fun a ha ↦ WithTop.lt_top_iff_ne_top.2 (h a ha)
-#align with_top.prod_lt_top WithTop.prod_lt_top
-
-/-- A sum of numbers is infinite iff one of them is infinite -/
-theorem sum_eq_top_iff [AddCommMonoid M] {s : Finset ι} {f : ι → WithTop M} :
- ∑ i in s, f i = ⊤ ↔ ∃ i ∈ s, f i = ⊤ := by
- induction s using Finset.cons_induction <;> simp [*]
-#align with_top.sum_eq_top_iff WithTop.sum_eq_top_iff
-
-/-- A sum of finite numbers is still finite -/
-theorem sum_lt_top_iff [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M} :
- ∑ i in s, f i < ⊤ ↔ ∀ i ∈ s, f i < ⊤ := by
- simp only [WithTop.lt_top_iff_ne_top, ne_eq, sum_eq_top_iff, not_exists, not_and]
-#align with_top.sum_lt_top_iff WithTop.sum_lt_top_iff
-
-/-- A sum of finite numbers is still finite -/
-theorem sum_lt_top [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M}
- (h : ∀ i ∈ s, f i ≠ ⊤) : ∑ i in s, f i < ⊤ :=
- sum_lt_top_iff.2 fun i hi => WithTop.lt_top_iff_ne_top.2 (h i hi)
-#align with_top.sum_lt_top WithTop.sum_lt_top
-
-end WithTop
-
section AbsoluteValue
variable {S : Type*}
$
with <|
(#9319)
See Zulip thread for the discussion.
@@ -690,7 +690,7 @@ variable [LinearOrderedCommSemiring α] [ExistsAddOfLE α]
lemma sum_mul_sq_le_sq_mul_sq (s : Finset ι) (f g : ι → α) :
(∑ i in s, f i * g i) ^ 2 ≤ (∑ i in s, f i ^ 2) * ∑ i in s, g i ^ 2 := by
nontriviality α
- obtain h' | h' := (sum_nonneg fun _ _ ↦ sq_nonneg $ g _).eq_or_lt
+ obtain h' | h' := (sum_nonneg fun _ _ ↦ sq_nonneg <| g _).eq_or_lt
· have h'' : ∀ i ∈ s, g i = 0 := fun i hi ↦ by
simpa using (sum_eq_zero_iff_of_nonneg fun i _ ↦ sq_nonneg (g i)).1 h'.symm i hi
rw [← h', sum_congr rfl (show ∀ i ∈ s, f i * g i = 0 from fun i hi ↦ by simp [h'' i hi])]
@@ -753,11 +753,11 @@ lemma one_le_prod (hf : 1 ≤ f) : 1 ≤ ∏ i, f i := Finset.one_le_prod' λ _
@[to_additive]
lemma prod_eq_one_iff_of_one_le (hf : 1 ≤ f) : ∏ i, f i = 1 ↔ f = 1 :=
- (Finset.prod_eq_one_iff_of_one_le' fun i _ ↦ hf i).trans $ by simp [Function.funext_iff]
+ (Finset.prod_eq_one_iff_of_one_le' fun i _ ↦ hf i).trans <| by simp [Function.funext_iff]
@[to_additive]
lemma prod_eq_one_iff_of_le_one (hf : f ≤ 1) : ∏ i, f i = 1 ↔ f = 1 :=
- (Finset.prod_eq_one_iff_of_le_one' fun i _ ↦ hf i).trans $ by simp [Function.funext_iff]
+ (Finset.prod_eq_one_iff_of_le_one' fun i _ ↦ hf i).trans <| by simp [Function.funext_iff]
end OrderedCommMonoid
@@ -774,11 +774,11 @@ theorem prod_strictMono' : StrictMono fun f : ι → M ↦ ∏ x, f x :=
@[to_additive sum_pos]
lemma one_lt_prod (hf : 1 < f) : 1 < ∏ i, f i :=
- Finset.one_lt_prod' (λ _ _ ↦ hf.le _) $ by simpa using (Pi.lt_def.1 hf).2
+ Finset.one_lt_prod' (λ _ _ ↦ hf.le _) <| by simpa using (Pi.lt_def.1 hf).2
@[to_additive]
lemma prod_lt_one (hf : f < 1) : ∏ i, f i < 1 :=
- Finset.prod_lt_one' (λ _ _ ↦ hf.le _) $ by simpa using (Pi.lt_def.1 hf).2
+ Finset.prod_lt_one' (λ _ _ ↦ hf.le _) <| by simpa using (Pi.lt_def.1 hf).2
@[to_additive sum_pos_iff_of_nonneg]
lemma one_lt_prod_iff_of_one_le (hf : 1 ≤ f) : 1 < ∏ i, f i ↔ 1 < f := by
This is a version of the Cauchy-Schwarz inequality that works in semirings.
From LeanAPAP and PFR
@@ -5,9 +5,10 @@ Authors: Johannes Hölzl
-/
import Mathlib.Algebra.Order.AbsoluteValue
import Mathlib.Algebra.Order.Ring.WithTop
-import Mathlib.Algebra.BigOperators.Basic
+import Mathlib.Algebra.BigOperators.Ring
import Mathlib.Data.Fintype.Card
import Mathlib.Tactic.GCongr.Core
+import Mathlib.Tactic.Ring
#align_import algebra.big_operators.order from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
@@ -191,13 +192,11 @@ theorem prod_eq_one_iff_of_one_le' :
#align finset.prod_eq_one_iff_of_one_le' Finset.prod_eq_one_iff_of_one_le'
#align finset.sum_eq_zero_iff_of_nonneg Finset.sum_eq_zero_iff_of_nonneg
-@[to_additive existing sum_eq_zero_iff_of_nonneg]
+@[to_additive sum_eq_zero_iff_of_nonpos]
theorem prod_eq_one_iff_of_le_one' :
(∀ i ∈ s, f i ≤ 1) → ((∏ i in s, f i) = 1 ↔ ∀ i ∈ s, f i = 1) :=
@prod_eq_one_iff_of_one_le' _ Nᵒᵈ _ _ _
#align finset.prod_eq_one_iff_of_le_one' Finset.prod_eq_one_iff_of_le_one'
--- Porting note: there is no align for the additive version since it aligns to the
--- same one as the previous lemma
@[to_additive single_le_sum]
theorem single_le_prod' (hf : ∀ i ∈ s, 1 ≤ f i) {a} (h : a ∈ s) : f a ≤ ∏ x in s, f x :=
@@ -685,6 +684,28 @@ theorem prod_lt_prod_of_nonempty (hf : ∀ i ∈ s, 0 < f i) (hfg : ∀ i ∈ s,
end StrictOrderedCommSemiring
+section LinearOrderedCommSemiring
+variable [LinearOrderedCommSemiring α] [ExistsAddOfLE α]
+
+lemma sum_mul_sq_le_sq_mul_sq (s : Finset ι) (f g : ι → α) :
+ (∑ i in s, f i * g i) ^ 2 ≤ (∑ i in s, f i ^ 2) * ∑ i in s, g i ^ 2 := by
+ nontriviality α
+ obtain h' | h' := (sum_nonneg fun _ _ ↦ sq_nonneg $ g _).eq_or_lt
+ · have h'' : ∀ i ∈ s, g i = 0 := fun i hi ↦ by
+ simpa using (sum_eq_zero_iff_of_nonneg fun i _ ↦ sq_nonneg (g i)).1 h'.symm i hi
+ rw [← h', sum_congr rfl (show ∀ i ∈ s, f i * g i = 0 from fun i hi ↦ by simp [h'' i hi])]
+ simp
+ refine le_of_mul_le_mul_of_pos_left
+ (le_of_add_le_add_left (a := (∑ i in s, g i ^ 2) * (∑ j in s, f j * g j) ^ 2) ?_) h'
+ calc
+ _ = ∑ i in s, 2 * (f i * ∑ j in s, g j ^ 2) * (g i * ∑ j in s, f j * g j) := by
+ simp_rw [mul_assoc (2 : α), mul_mul_mul_comm, ← mul_sum, ← sum_mul]; ring
+ _ ≤ ∑ i in s, ((f i * ∑ j in s, g j ^ 2) ^ 2 + (g i * ∑ j in s, f j * g j) ^ 2) :=
+ sum_le_sum fun i _ ↦ two_mul_le_add_sq (f i * ∑ j in s, g j ^ 2) (g i * ∑ j in s, f j * g j)
+ _ = _ := by simp_rw [sum_add_distrib, mul_pow, ← sum_mul]; ring
+
+end LinearOrderedCommSemiring
+
section CanonicallyOrderedCommSemiring
variable [CanonicallyOrderedCommSemiring R] {f g h : ι → R} {s : Finset ι} {i : ι}
@@ -730,6 +751,14 @@ lemma one_le_prod (hf : 1 ≤ f) : 1 ≤ ∏ i, f i := Finset.one_le_prod' λ _
@[to_additive] lemma prod_le_one (hf : f ≤ 1) : ∏ i, f i ≤ 1 := Finset.prod_le_one' λ _ _ ↦ hf _
+@[to_additive]
+lemma prod_eq_one_iff_of_one_le (hf : 1 ≤ f) : ∏ i, f i = 1 ↔ f = 1 :=
+ (Finset.prod_eq_one_iff_of_one_le' fun i _ ↦ hf i).trans $ by simp [Function.funext_iff]
+
+@[to_additive]
+lemma prod_eq_one_iff_of_le_one (hf : f ≤ 1) : ∏ i, f i = 1 ↔ f = 1 :=
+ (Finset.prod_eq_one_iff_of_le_one' fun i _ ↦ hf i).trans $ by simp [Function.funext_iff]
+
end OrderedCommMonoid
section OrderedCancelCommMonoid
@@ -759,16 +788,6 @@ lemma one_lt_prod_iff_of_one_le (hf : 1 ≤ f) : 1 < ∏ i, f i ↔ 1 < f := by
lemma prod_lt_one_iff_of_le_one (hf : f ≤ 1) : ∏ i, f i < 1 ↔ f < 1 := by
obtain rfl | hf := hf.eq_or_lt <;> simp [*, prod_lt_one]
-@[to_additive]
-lemma prod_eq_one_iff_of_one_le (hf : 1 ≤ f) : ∏ i, f i = 1 ↔ f = 1 := by
- simpa only [(one_le_prod hf).not_gt_iff_eq, hf.not_gt_iff_eq]
- using (one_lt_prod_iff_of_one_le hf).not
-
-@[to_additive]
-lemma prod_eq_one_iff_of_le_one (hf : f ≤ 1) : ∏ i, f i = 1 ↔ f = 1 := by
- simpa only [(prod_le_one hf).not_gt_iff_eq, hf.not_gt_iff_eq, eq_comm]
- using (prod_lt_one_iff_of_le_one hf).not
-
end OrderedCancelCommMonoid
end Fintype
Finset
lemma names (#8894)
Change a few lemma names that have historically bothered me.
Finset.card_le_of_subset
→ Finset.card_le_card
Multiset.card_le_of_le
→ Multiset.card_le_card
Multiset.card_lt_of_lt
→ Multiset.card_lt_card
Set.ncard_le_of_subset
→ Set.ncard_le_ncard
Finset.image_filter
→ Finset.filter_image
CompleteLattice.finset_sup_compact_of_compact
→ CompleteLattice.isCompactElement_finset_sup
@@ -385,7 +385,7 @@ theorem card_le_card_biUnion_add_card_fiber {s : Finset ι} {f : ι → Finset
add_le_add_right
((card_le_card_biUnion (hs.subset <| filter_subset _ _) fun i hi ↦
nonempty_of_ne_empty <| (mem_filter.1 hi).2).trans <|
- card_le_of_subset <| biUnion_subset_biUnion_of_subset_left _ <| filter_subset _ _)
+ card_le_card <| biUnion_subset_biUnion_of_subset_left _ <| filter_subset _ _)
_
#align finset.card_le_card_bUnion_add_card_fiber Finset.card_le_card_biUnion_add_card_fiber
∃ x ∈ s, _
instead of ∃ (x) (_ : x ∈ s), _
(#9184)
Search for [∀∃].*(_
and manually replace some occurrences with more readable versions.
In case of ∀
, the new expressions are defeq to the old ones.
In case of ∃
, they differ by exists_prop
.
In some rare cases, golf proofs that needed fixing.
@@ -242,7 +242,7 @@ variable {ι' : Type*} [DecidableEq ι']
-- Porting note: Mathport warning: expanding binder collection (y «expr ∉ » t)
@[to_additive sum_fiberwise_le_sum_of_sum_fiber_nonneg]
theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
- (h : ∀ (y) (_ : y ∉ t), (1 : N) ≤ ∏ x in s.filter fun x ↦ g x = y, f x) :
+ (h : ∀ y ∉ t, (1 : N) ≤ ∏ x in s.filter fun x ↦ g x = y, f x) :
(∏ y in t, ∏ x in s.filter fun x ↦ g x = y, f x) ≤ ∏ x in s, f x :=
calc
(∏ y in t, ∏ x in s.filter fun x ↦ g x = y, f x) ≤
@@ -256,7 +256,7 @@ theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι
-- Porting note: Mathport warning: expanding binder collection (y «expr ∉ » t)
@[to_additive sum_le_sum_fiberwise_of_sum_fiber_nonpos]
theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
- (h : ∀ (y) (_ : y ∉ t), ∏ x in s.filter fun x ↦ g x = y, f x ≤ 1) :
+ (h : ∀ y ∉ t, ∏ x in s.filter fun x ↦ g x = y, f x ≤ 1) :
∏ x in s, f x ≤ ∏ y in t, ∏ x in s.filter fun x ↦ g x = y, f x :=
@prod_fiberwise_le_prod_of_one_le_prod_fiber' _ Nᵒᵈ _ _ _ _ _ _ _ h
#align finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one'
(· op ·) a
by (a op ·)
(#8843)
I used the regex \(\(· (.) ·\) (.)\)
, replacing with ($2 $1 ·)
.
@@ -323,7 +323,7 @@ variable [DecidableEq α] {s : Finset α} {B : Finset (Finset α)} {n : ℕ}
/-- If every element belongs to at most `n` Finsets, then the sum of their sizes is at most `n`
times how many they are. -/
-theorem sum_card_inter_le (h : ∀ a ∈ s, (B.filter <| (· ∈ ·) a).card ≤ n) :
+theorem sum_card_inter_le (h : ∀ a ∈ s, (B.filter (a ∈ ·)).card ≤ n) :
(∑ t in B, (s ∩ t).card) ≤ s.card * n := by
refine' le_trans _ (s.sum_le_card_nsmul _ _ h)
simp_rw [← filter_mem_eq_inter, card_eq_sum_ones, sum_filter]
@@ -332,7 +332,7 @@ theorem sum_card_inter_le (h : ∀ a ∈ s, (B.filter <| (· ∈ ·) a).card ≤
/-- If every element belongs to at most `n` Finsets, then the sum of their sizes is at most `n`
times how many they are. -/
-theorem sum_card_le [Fintype α] (h : ∀ a, (B.filter <| (· ∈ ·) a).card ≤ n) :
+theorem sum_card_le [Fintype α] (h : ∀ a, (B.filter (a ∈ ·)).card ≤ n) :
∑ s in B, s.card ≤ Fintype.card α * n :=
calc
∑ s in B, s.card = ∑ s in B, (univ ∩ s).card := by simp_rw [univ_inter]
@@ -341,7 +341,7 @@ theorem sum_card_le [Fintype α] (h : ∀ a, (B.filter <| (· ∈ ·) a).card
/-- If every element belongs to at least `n` Finsets, then the sum of their sizes is at least `n`
times how many they are. -/
-theorem le_sum_card_inter (h : ∀ a ∈ s, n ≤ (B.filter <| (· ∈ ·) a).card) :
+theorem le_sum_card_inter (h : ∀ a ∈ s, n ≤ (B.filter (a ∈ ·)).card) :
s.card * n ≤ ∑ t in B, (s ∩ t).card := by
apply (s.card_nsmul_le_sum _ _ h).trans
simp_rw [← filter_mem_eq_inter, card_eq_sum_ones, sum_filter]
@@ -350,7 +350,7 @@ theorem le_sum_card_inter (h : ∀ a ∈ s, n ≤ (B.filter <| (· ∈ ·) a).ca
/-- If every element belongs to at least `n` Finsets, then the sum of their sizes is at least `n`
times how many they are. -/
-theorem le_sum_card [Fintype α] (h : ∀ a, n ≤ (B.filter <| (· ∈ ·) a).card) :
+theorem le_sum_card [Fintype α] (h : ∀ a, n ≤ (B.filter (a ∈ ·)).card) :
Fintype.card α * n ≤ ∑ s in B, s.card :=
calc
Fintype.card α * n ≤ ∑ s in B, (univ ∩ s).card := le_sum_card_inter fun a _ ↦ h a
@@ -359,14 +359,14 @@ theorem le_sum_card [Fintype α] (h : ∀ a, n ≤ (B.filter <| (· ∈ ·) a).c
/-- If every element belongs to exactly `n` Finsets, then the sum of their sizes is `n` times how
many they are. -/
-theorem sum_card_inter (h : ∀ a ∈ s, (B.filter <| (· ∈ ·) a).card = n) :
+theorem sum_card_inter (h : ∀ a ∈ s, (B.filter (a ∈ ·)).card = n) :
(∑ t in B, (s ∩ t).card) = s.card * n :=
(sum_card_inter_le fun a ha ↦ (h a ha).le).antisymm (le_sum_card_inter fun a ha ↦ (h a ha).ge)
#align finset.sum_card_inter Finset.sum_card_inter
/-- If every element belongs to exactly `n` Finsets, then the sum of their sizes is `n` times how
many they are. -/
-theorem sum_card [Fintype α] (h : ∀ a, (B.filter <| (· ∈ ·) a).card = n) :
+theorem sum_card [Fintype α] (h : ∀ a, (B.filter (a ∈ ·)).card = n) :
∑ s in B, s.card = Fintype.card α * n := by
simp_rw [Fintype.card, ← sum_card_inter fun a _ ↦ h a, univ_inter]
#align finset.sum_card Finset.sum_card
@@ -280,7 +280,7 @@ theorem abs_sum_of_nonneg' {G : Type*} [LinearOrderedAddCommGroup G] {f : ι →
theorem abs_prod {R : Type*} [LinearOrderedCommRing R] {f : ι → R} {s : Finset ι} :
|∏ x in s, f x| = ∏ x in s, |f x| :=
- (absHom.toMonoidHom : R →* R).map_prod _ _
+ map_prod absHom _ _
#align finset.abs_prod Finset.abs_prod
section Pigeonhole
@@ -817,10 +817,10 @@ theorem IsAbsoluteValue.abv_sum [Semiring R] [OrderedSemiring S] (abv : R → S)
(IsAbsoluteValue.toAbsoluteValue abv).sum_le _ _
#align is_absolute_value.abv_sum IsAbsoluteValue.abv_sum
-theorem AbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedCommRing S]
+nonrec theorem AbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedCommRing S]
(abv : AbsoluteValue R S) (f : ι → R) (s : Finset ι) :
abv (∏ i in s, f i) = ∏ i in s, abv (f i) :=
- abv.toMonoidHom.map_prod f s
+ map_prod abv f s
#align absolute_value.map_prod AbsoluteValue.map_prod
theorem IsAbsoluteValue.map_prod [CommSemiring R] [Nontrivial R] [LinearOrderedCommRing S]
@@ -545,13 +545,15 @@ variable [DecidableEq ι]
@[to_additive] lemma prod_sdiff_le_prod_sdiff :
∏ i in s \ t, f i ≤ ∏ i in t \ s, f i ↔ ∏ i in s, f i ≤ ∏ i in t, f i := by
- rw [←mul_le_mul_iff_right, ←prod_union (disjoint_sdiff_inter _ _), sdiff_union_inter, ←prod_union,
- inter_comm, sdiff_union_inter]; simpa only [inter_comm] using disjoint_sdiff_inter t s
+ rw [← mul_le_mul_iff_right, ← prod_union (disjoint_sdiff_inter _ _), sdiff_union_inter,
+ ← prod_union, inter_comm, sdiff_union_inter];
+ simpa only [inter_comm] using disjoint_sdiff_inter t s
@[to_additive] lemma prod_sdiff_lt_prod_sdiff :
∏ i in s \ t, f i < ∏ i in t \ s, f i ↔ ∏ i in s, f i < ∏ i in t, f i := by
- rw [←mul_lt_mul_iff_right, ←prod_union (disjoint_sdiff_inter _ _), sdiff_union_inter, ←prod_union,
- inter_comm, sdiff_union_inter]; simpa only [inter_comm] using disjoint_sdiff_inter t s
+ rw [← mul_lt_mul_iff_right, ← prod_union (disjoint_sdiff_inter _ _), sdiff_union_inter,
+ ← prod_union, inter_comm, sdiff_union_inter];
+ simpa only [inter_comm] using disjoint_sdiff_inter t s
end OrderedCancelCommMonoid
Multiset.sum_lt_sum
et al (#8707)
Lean discussion: https://leanprover.zulipchat.com/#narrow/stream/217875-Is-there-code-for-X.3F/topic/Multiset.2Esum_lt_sum
@@ -442,23 +442,16 @@ section OrderedCancelCommMonoid
variable [OrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
@[to_additive sum_lt_sum]
-theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i < g i) :
- ∏ i in s, f i < ∏ i in s, g i := by
- classical
- rcases Hlt with ⟨i, hi, hlt⟩
- rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
- exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod' fun j hj ↦ Hle j <| mem_of_mem_erase hj)
+theorem prod_lt_prod' (hle : ∀ i ∈ s, f i ≤ g i) (hlt : ∃ i ∈ s, f i < g i) :
+ ∏ i in s, f i < ∏ i in s, g i :=
+ Multiset.prod_lt_prod' hle hlt
#align finset.prod_lt_prod' Finset.prod_lt_prod'
#align finset.sum_lt_sum Finset.sum_lt_sum
@[to_additive sum_lt_sum_of_nonempty]
-theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g i) :
- ∏ i in s, f i < ∏ i in s, g i := by
- apply prod_lt_prod'
- · intro i hi
- apply le_of_lt (Hlt i hi)
- cases' hs with i hi
- exact ⟨i, hi, Hlt i hi⟩
+theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (hlt : ∀ i ∈ s, f i < g i) :
+ ∏ i in s, f i < ∏ i in s, g i :=
+ Multiset.prod_lt_prod_of_nonempty' (by aesop) hlt
#align finset.prod_lt_prod_of_nonempty' Finset.prod_lt_prod_of_nonempty'
#align finset.sum_lt_sum_of_nonempty Finset.sum_lt_sum_of_nonempty
@@ -548,6 +548,18 @@ theorem prod_eq_prod_iff_of_le {f g : ι → M} (h : ∀ i ∈ s, f i ≤ g i) :
#align finset.prod_eq_prod_iff_of_le Finset.prod_eq_prod_iff_of_le
#align finset.sum_eq_sum_iff_of_le Finset.sum_eq_sum_iff_of_le
+variable [DecidableEq ι]
+
+@[to_additive] lemma prod_sdiff_le_prod_sdiff :
+ ∏ i in s \ t, f i ≤ ∏ i in t \ s, f i ↔ ∏ i in s, f i ≤ ∏ i in t, f i := by
+ rw [←mul_le_mul_iff_right, ←prod_union (disjoint_sdiff_inter _ _), sdiff_union_inter, ←prod_union,
+ inter_comm, sdiff_union_inter]; simpa only [inter_comm] using disjoint_sdiff_inter t s
+
+@[to_additive] lemma prod_sdiff_lt_prod_sdiff :
+ ∏ i in s \ t, f i < ∏ i in t \ s, f i ↔ ∏ i in s, f i < ∏ i in t, f i := by
+ rw [←mul_lt_mul_iff_right, ←prod_union (disjoint_sdiff_inter _ _), sdiff_union_inter, ←prod_union,
+ inter_comm, sdiff_union_inter]; simpa only [inter_comm] using disjoint_sdiff_inter t s
+
end OrderedCancelCommMonoid
section LinearOrderedCancelCommMonoid
attach
and filter
lemmas (#1470)
Match https://github.com/leanprover-community/mathlib/pull/18087
@@ -9,7 +9,7 @@ import Mathlib.Algebra.BigOperators.Basic
import Mathlib.Data.Fintype.Card
import Mathlib.Tactic.GCongr.Core
-#align_import algebra.big_operators.order from "leanprover-community/mathlib"@"824f9ae93a4f5174d2ea948e2d75843dd83447bb"
+#align_import algebra.big_operators.order from "leanprover-community/mathlib"@"65a1391a0106c9204fe45bc73a039f056558cb83"
/-!
# Results about big operators with values in an ordered algebraic structure.
@@ -223,7 +223,6 @@ theorem prod_le_pow_card (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s
refine' (Multiset.prod_le_pow_card (s.val.map f) n _).trans _
· simpa using h
· simp
- rfl
#align finset.prod_le_pow_card Finset.prod_le_pow_card
#align finset.sum_le_card_nsmul Finset.sum_le_card_nsmul
@@ -208,6 +208,15 @@ theorem single_le_prod' (hf : ∀ i ∈ s, 1 ≤ f i) {a} (h : a ∈ s) : f a
#align finset.single_le_prod' Finset.single_le_prod'
#align finset.single_le_sum Finset.single_le_sum
+@[to_additive]
+lemma mul_le_prod {i j : ι} (hf : ∀ i ∈ s, 1 ≤ f i) (hi : i ∈ s) (hj : j ∈ s) (hne : i ≠ j) :
+ f i * f j ≤ ∏ k in s, f k :=
+ calc
+ f i * f j = ∏ k in .cons i {j} (by simpa), f k := by rw [prod_cons, prod_singleton]
+ _ ≤ ∏ k in s, f k := by
+ refine prod_le_prod_of_subset_of_one_le' ?_ fun k hk _ ↦ hf k hk
+ simp [cons_subset, *]
+
@[to_additive sum_le_card_nsmul]
theorem prod_le_pow_card (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s, f x ≤ n) :
s.prod f ≤ n ^ s.card := by
Add a product variant of mul_lt_mul, following the pattern of Finset.prod_lt_prod'. This fills in a gap between Finset.prod_le_prod, Finset.prod_le_prod' and Finset.prod_lt_prod'.
@@ -642,13 +642,32 @@ end OrderedCommSemiring
section StrictOrderedCommSemiring
-variable [StrictOrderedCommSemiring R] [Nontrivial R] {f : ι → R} {s : Finset ι}
+variable [StrictOrderedCommSemiring R] {f g : ι → R} {s : Finset ι}
-- This is also true for an ordered commutative multiplicative monoid with zero
theorem prod_pos (h0 : ∀ i ∈ s, 0 < f i) : 0 < ∏ i in s, f i :=
prod_induction f (fun x ↦ 0 < x) (fun _ _ ha hb ↦ mul_pos ha hb) zero_lt_one h0
#align finset.prod_pos Finset.prod_pos
+theorem prod_lt_prod (hf : ∀ i ∈ s, 0 < f i) (hfg : ∀ i ∈ s, f i ≤ g i)
+ (hlt : ∃ i ∈ s, f i < g i) :
+ ∏ i in s, f i < ∏ i in s, g i := by
+ classical
+ obtain ⟨i, hi, hilt⟩ := hlt
+ rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
+ apply mul_lt_mul hilt
+ · exact prod_le_prod (fun j hj => le_of_lt (hf j (mem_of_mem_erase hj)))
+ (fun _ hj ↦ hfg _ <| mem_of_mem_erase hj)
+ · exact prod_pos fun j hj => hf j (mem_of_mem_erase hj)
+ · exact le_of_lt <| (hf i hi).trans hilt
+
+theorem prod_lt_prod_of_nonempty (hf : ∀ i ∈ s, 0 < f i) (hfg : ∀ i ∈ s, f i < g i)
+ (h_ne : s.Nonempty) :
+ ∏ i in s, f i < ∏ i in s, g i := by
+ apply prod_lt_prod hf fun i hi => le_of_lt (hfg i hi)
+ obtain ⟨i, hi⟩ := h_ne
+ exact ⟨i, hi, hfg i hi⟩
+
end StrictOrderedCommSemiring
section CanonicallyOrderedCommSemiring
Renames:
CanonicallyOrderedMonoid
->
CanonicallyOrderedCommMonoid
CanonicallyOrderedAddMonoid
->
CanonicallyOrderedAddCommMonoid
CanonicallyLinearOrderedMonoid
->
CanonicallyLinearOrderedCommMonoid
CanonicallyLinearOrderedAddMonoid
->
CanonicallyLinearOrderedAddCommMonoid
@@ -390,9 +390,9 @@ theorem card_le_card_biUnion_add_one {s : Finset ι} {f : ι → Finset α} (hf
end DoubleCounting
-section CanonicallyOrderedMonoid
+section CanonicallyOrderedCommMonoid
-variable [CanonicallyOrderedMonoid M] {f : ι → M} {s t : Finset ι}
+variable [CanonicallyOrderedCommMonoid M] {f : ι → M} {s t : Finset ι}
@[to_additive (attr := simp) sum_eq_zero_iff]
theorem prod_eq_one_iff' : ∏ x in s, f x = 1 ↔ ∀ x ∈ s, f x = 1 :=
@@ -427,7 +427,7 @@ theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) :
#align finset.prod_le_prod_of_ne_one' Finset.prod_le_prod_of_ne_one'
#align finset.sum_le_sum_of_ne_zero Finset.sum_le_sum_of_ne_zero
-end CanonicallyOrderedMonoid
+end CanonicallyOrderedCommMonoid
section OrderedCancelCommMonoid
Also fix implicitness of arguments to Finset.sum_singleton
.
@@ -202,7 +202,7 @@ theorem prod_eq_one_iff_of_le_one' :
@[to_additive single_le_sum]
theorem single_le_prod' (hf : ∀ i ∈ s, 1 ≤ f i) {a} (h : a ∈ s) : f a ≤ ∏ x in s, f x :=
calc
- f a = ∏ i in {a}, f i := prod_singleton.symm
+ f a = ∏ i in {a}, f i := (prod_singleton _ _).symm
_ ≤ ∏ i in s, f i :=
prod_le_prod_of_subset_of_one_le' (singleton_subset_iff.2 h) fun i hi _ ↦ hf i hi
#align finset.single_le_prod' Finset.single_le_prod'
@@ -494,7 +494,7 @@ theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i
theorem single_lt_prod' {i j : ι} (hij : j ≠ i) (hi : i ∈ s) (hj : j ∈ s) (hlt : 1 < f j)
(hle : ∀ k ∈ s, k ≠ i → 1 ≤ f k) : f i < ∏ k in s, f k :=
calc
- f i = ∏ k in {i}, f k := prod_singleton.symm
+ f i = ∏ k in {i}, f k := by rw [prod_singleton]
_ < ∏ k in s, f k :=
prod_lt_prod_of_subset' (singleton_subset_iff.2 hi) hj (mt mem_singleton.1 hij) hlt
fun k hks hki ↦ hle k hks (mt mem_singleton.2 hki)
@@ -682,23 +682,60 @@ end CanonicallyOrderedCommSemiring
end Finset
namespace Fintype
-
-variable [Fintype ι]
+section OrderedCommMonoid
+variable [Fintype ι] [OrderedCommMonoid M] {f : ι → M}
@[to_additive (attr := mono) sum_mono]
-theorem prod_mono' [OrderedCommMonoid M] : Monotone fun f : ι → M ↦ ∏ i, f i := fun _ _ hfg ↦
+theorem prod_mono' : Monotone fun f : ι → M ↦ ∏ i, f i := fun _ _ hfg ↦
Finset.prod_le_prod' fun x _ ↦ hfg x
#align fintype.prod_mono' Fintype.prod_mono'
#align fintype.sum_mono Fintype.sum_mono
+@[to_additive sum_nonneg]
+lemma one_le_prod (hf : 1 ≤ f) : 1 ≤ ∏ i, f i := Finset.one_le_prod' λ _ _ ↦ hf _
+
+@[to_additive] lemma prod_le_one (hf : f ≤ 1) : ∏ i, f i ≤ 1 := Finset.prod_le_one' λ _ _ ↦ hf _
+
+end OrderedCommMonoid
+
+section OrderedCancelCommMonoid
+variable [Fintype ι] [OrderedCancelCommMonoid M] {f : ι → M}
+
@[to_additive sum_strictMono]
-theorem prod_strictMono' [OrderedCancelCommMonoid M] : StrictMono fun f : ι → M ↦ ∏ x, f x :=
+theorem prod_strictMono' : StrictMono fun f : ι → M ↦ ∏ x, f x :=
fun _ _ hfg ↦
let ⟨hle, i, hlt⟩ := Pi.lt_def.mp hfg
Finset.prod_lt_prod' (fun i _ ↦ hle i) ⟨i, Finset.mem_univ i, hlt⟩
#align fintype.prod_strict_mono' Fintype.prod_strictMono'
#align fintype.sum_strict_mono Fintype.sum_strictMono
+@[to_additive sum_pos]
+lemma one_lt_prod (hf : 1 < f) : 1 < ∏ i, f i :=
+ Finset.one_lt_prod' (λ _ _ ↦ hf.le _) $ by simpa using (Pi.lt_def.1 hf).2
+
+@[to_additive]
+lemma prod_lt_one (hf : f < 1) : ∏ i, f i < 1 :=
+ Finset.prod_lt_one' (λ _ _ ↦ hf.le _) $ by simpa using (Pi.lt_def.1 hf).2
+
+@[to_additive sum_pos_iff_of_nonneg]
+lemma one_lt_prod_iff_of_one_le (hf : 1 ≤ f) : 1 < ∏ i, f i ↔ 1 < f := by
+ obtain rfl | hf := hf.eq_or_lt <;> simp [*, one_lt_prod]
+
+@[to_additive]
+lemma prod_lt_one_iff_of_le_one (hf : f ≤ 1) : ∏ i, f i < 1 ↔ f < 1 := by
+ obtain rfl | hf := hf.eq_or_lt <;> simp [*, prod_lt_one]
+
+@[to_additive]
+lemma prod_eq_one_iff_of_one_le (hf : 1 ≤ f) : ∏ i, f i = 1 ↔ f = 1 := by
+ simpa only [(one_le_prod hf).not_gt_iff_eq, hf.not_gt_iff_eq]
+ using (one_lt_prod_iff_of_one_le hf).not
+
+@[to_additive]
+lemma prod_eq_one_iff_of_le_one (hf : f ≤ 1) : ∏ i, f i = 1 ↔ f = 1 := by
+ simpa only [(prod_le_one hf).not_gt_iff_eq, hf.not_gt_iff_eq, eq_comm]
+ using (prod_lt_one_iff_of_le_one hf).not
+
+end OrderedCancelCommMonoid
end Fintype
namespace WithTop
Type _
and Sort _
(#6499)
We remove all possible occurences of Type _
and Sort _
in favor of Type*
and Sort*
.
This has nice performance benefits.
@@ -22,7 +22,7 @@ open Function
open BigOperators
-variable {ι α β M N G k R : Type _}
+variable {ι α β M N G k R : Type*}
namespace Finset
@@ -229,7 +229,7 @@ theorem card_biUnion_le_card_mul [DecidableEq β] (s : Finset ι) (f : ι → Fi
card_biUnion_le.trans <| sum_le_card_nsmul _ _ _ h
#align finset.card_bUnion_le_card_mul Finset.card_biUnion_le_card_mul
-variable {ι' : Type _} [DecidableEq ι']
+variable {ι' : Type*} [DecidableEq ι']
-- Porting note: Mathport warning: expanding binder collection (y «expr ∉ » t)
@[to_additive sum_fiberwise_le_sum_of_sum_fiber_nonneg]
@@ -256,21 +256,21 @@ theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι
end OrderedCommMonoid
-theorem abs_sum_le_sum_abs {G : Type _} [LinearOrderedAddCommGroup G] (f : ι → G) (s : Finset ι) :
+theorem abs_sum_le_sum_abs {G : Type*} [LinearOrderedAddCommGroup G] (f : ι → G) (s : Finset ι) :
|∑ i in s, f i| ≤ ∑ i in s, |f i| := le_sum_of_subadditive _ abs_zero abs_add s f
#align finset.abs_sum_le_sum_abs Finset.abs_sum_le_sum_abs
-theorem abs_sum_of_nonneg {G : Type _} [LinearOrderedAddCommGroup G] {f : ι → G} {s : Finset ι}
+theorem abs_sum_of_nonneg {G : Type*} [LinearOrderedAddCommGroup G] {f : ι → G} {s : Finset ι}
(hf : ∀ i ∈ s, 0 ≤ f i) : |∑ i : ι in s, f i| = ∑ i : ι in s, f i := by
rw [abs_of_nonneg (Finset.sum_nonneg hf)]
#align finset.abs_sum_of_nonneg Finset.abs_sum_of_nonneg
-theorem abs_sum_of_nonneg' {G : Type _} [LinearOrderedAddCommGroup G] {f : ι → G} {s : Finset ι}
+theorem abs_sum_of_nonneg' {G : Type*} [LinearOrderedAddCommGroup G] {f : ι → G} {s : Finset ι}
(hf : ∀ i, 0 ≤ f i) : |∑ i : ι in s, f i| = ∑ i : ι in s, f i := by
rw [abs_of_nonneg (Finset.sum_nonneg' hf)]
#align finset.abs_sum_of_nonneg' Finset.abs_sum_of_nonneg'
-theorem abs_prod {R : Type _} [LinearOrderedCommRing R] {f : ι → R} {s : Finset ι} :
+theorem abs_prod {R : Type*} [LinearOrderedCommRing R] {f : ι → R} {s : Finset ι} :
|∏ x in s, f x| = ∏ x in s, |f x| :=
(absHom.toMonoidHom : R →* R).map_prod _ _
#align finset.abs_prod Finset.abs_prod
@@ -734,7 +734,7 @@ end WithTop
section AbsoluteValue
-variable {S : Type _}
+variable {S : Type*}
theorem AbsoluteValue.sum_le [Semiring R] [OrderedSemiring S] (abv : AbsoluteValue R S)
(s : Finset ι) (f : ι → R) : abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) :=
@@ -691,13 +691,13 @@ theorem prod_mono' [OrderedCommMonoid M] : Monotone fun f : ι → M ↦ ∏ i,
#align fintype.prod_mono' Fintype.prod_mono'
#align fintype.sum_mono Fintype.sum_mono
-@[to_additive sum_strict_mono]
-theorem prod_strict_mono' [OrderedCancelCommMonoid M] : StrictMono fun f : ι → M ↦ ∏ x, f x :=
+@[to_additive sum_strictMono]
+theorem prod_strictMono' [OrderedCancelCommMonoid M] : StrictMono fun f : ι → M ↦ ∏ x, f x :=
fun _ _ hfg ↦
let ⟨hle, i, hlt⟩ := Pi.lt_def.mp hfg
Finset.prod_lt_prod' (fun i _ ↦ hle i) ⟨i, Finset.mem_univ i, hlt⟩
-#align fintype.prod_strict_mono' Fintype.prod_strict_mono'
-#align fintype.sum_strict_mono Fintype.sum_strict_mono
+#align fintype.prod_strict_mono' Fintype.prod_strictMono'
+#align fintype.sum_strict_mono Fintype.sum_strictMono
end Fintype
@@ -2,11 +2,6 @@
Copyright (c) 2017 Johannes Hölzl. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
-
-! This file was ported from Lean 3 source module algebra.big_operators.order
-! leanprover-community/mathlib commit 824f9ae93a4f5174d2ea948e2d75843dd83447bb
-! Please do not edit these lines, except to modify the commit id
-! if you have ported upstream changes.
-/
import Mathlib.Algebra.Order.AbsoluteValue
import Mathlib.Algebra.Order.Ring.WithTop
@@ -14,6 +9,8 @@ import Mathlib.Algebra.BigOperators.Basic
import Mathlib.Data.Fintype.Card
import Mathlib.Tactic.GCongr.Core
+#align_import algebra.big_operators.order from "leanprover-community/mathlib"@"824f9ae93a4f5174d2ea948e2d75843dd83447bb"
+
/-!
# Results about big operators with values in an ordered algebraic structure.
This is the second half of the changes originally in #5699, removing all occurrences of ;
after a space and implementing a linter rule to enforce it.
In most cases this 2-character substring has a space after it, so the following command was run first:
find . -type f -name "*.lean" -exec sed -i -E 's/ ; /; /g' {} \;
The remaining cases were few enough in number that they were done manually.
@@ -425,7 +425,7 @@ theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) :
exact disjoint_filter.2 fun _ _ h n_h ↦ n_h h
_ ≤ ∏ x in t, f x :=
mul_le_of_le_one_of_le
- (prod_le_one' <| by simp only [mem_filter, and_imp] ; exact fun _ _ ↦ le_of_eq)
+ (prod_le_one' <| by simp only [mem_filter, and_imp]; exact fun _ _ ↦ le_of_eq)
(prod_le_prod_of_subset' <| by simpa only [subset_iff, mem_filter, and_imp] )
#align finset.prod_le_prod_of_ne_one' Finset.prod_le_prod_of_ne_one'
#align finset.sum_le_sum_of_ne_zero Finset.sum_le_sum_of_ne_zero
∑'
precedence (#5615)
∑
, ∏
and variants).([^a-zA-Zα-ωΑ-Ω'𝓝ℳ₀𝕂ₛ)]) \(([∑∏][^()∑∏]*,[^()∑∏:]*)\) ([⊂⊆=<≤])
replaced by $1 $2 $3
@@ -112,7 +112,7 @@ variable {f g : ι → N} {s t : Finset ι}
equal to the corresponding factor `g i` of another finite product, then
`∏ i in s, f i ≤ ∏ i in s, g i`. -/
@[to_additive sum_le_sum]
-theorem prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) : (∏ i in s, f i) ≤ ∏ i in s, g i :=
+theorem prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) : ∏ i in s, f i ≤ ∏ i in s, g i :=
Multiset.prod_map_le_prod_map f g h
#align finset.prod_le_prod' Finset.prod_le_prod'
#align finset.sum_le_sum Finset.sum_le_sum
@@ -151,16 +151,16 @@ theorem one_le_prod'' (h : ∀ i : ι, 1 ≤ f i) : 1 ≤ ∏ i : ι in s, f i :
#align finset.sum_nonneg' Finset.sum_nonneg'
@[to_additive sum_nonpos]
-theorem prod_le_one' (h : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 :=
+theorem prod_le_one' (h : ∀ i ∈ s, f i ≤ 1) : ∏ i in s, f i ≤ 1 :=
(prod_le_prod' h).trans_eq (by rw [prod_const_one])
#align finset.prod_le_one' Finset.prod_le_one'
#align finset.sum_nonpos Finset.sum_nonpos
@[to_additive sum_le_sum_of_subset_of_nonneg]
theorem prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉ s → 1 ≤ f i) :
- (∏ i in s, f i) ≤ ∏ i in t, f i := by
+ ∏ i in s, f i ≤ ∏ i in t, f i := by
classical calc
- (∏ i in s, f i) ≤ (∏ i in t \ s, f i) * ∏ i in s, f i :=
+ ∏ i in s, f i ≤ (∏ i in t \ s, f i) * ∏ i in s, f i :=
le_mul_of_one_le_left' <| one_le_prod' <| by simpa only [mem_sdiff, and_imp]
_ = ∏ i in t \ s ∪ s, f i := (prod_union sdiff_disjoint).symm
_ = ∏ i in t, f i := by rw [sdiff_union_of_subset h]
@@ -175,7 +175,7 @@ theorem prod_mono_set_of_one_le' (hf : ∀ x, 1 ≤ f x) : Monotone fun s ↦
@[to_additive sum_le_univ_sum_of_nonneg]
theorem prod_le_univ_prod_of_one_le' [Fintype ι] {s : Finset ι} (w : ∀ x, 1 ≤ f x) :
- (∏ x in s, f x) ≤ ∏ x, f x :=
+ ∏ x in s, f x ≤ ∏ x, f x :=
prod_le_prod_of_subset_of_one_le' (subset_univ s) fun a _ _ ↦ w a
#align finset.prod_le_univ_prod_of_one_le' Finset.prod_le_univ_prod_of_one_le'
#align finset.sum_le_univ_sum_of_nonneg Finset.sum_le_univ_sum_of_nonneg
@@ -251,8 +251,8 @@ theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι
-- Porting note: Mathport warning: expanding binder collection (y «expr ∉ » t)
@[to_additive sum_le_sum_fiberwise_of_sum_fiber_nonpos]
theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι → ι'} {f : ι → N}
- (h : ∀ (y) (_ : y ∉ t), (∏ x in s.filter fun x ↦ g x = y, f x) ≤ 1) :
- (∏ x in s, f x) ≤ ∏ y in t, ∏ x in s.filter fun x ↦ g x = y, f x :=
+ (h : ∀ (y) (_ : y ∉ t), ∏ x in s.filter fun x ↦ g x = y, f x ≤ 1) :
+ ∏ x in s, f x ≤ ∏ y in t, ∏ x in s.filter fun x ↦ g x = y, f x :=
@prod_fiberwise_le_prod_of_one_le_prod_fiber' _ Nᵒᵈ _ _ _ _ _ _ _ h
#align finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one'
#align finset.sum_le_sum_fiberwise_of_sum_fiber_nonpos Finset.sum_le_sum_fiberwise_of_sum_fiber_nonpos
@@ -328,9 +328,9 @@ theorem sum_card_inter_le (h : ∀ a ∈ s, (B.filter <| (· ∈ ·) a).card ≤
/-- If every element belongs to at most `n` Finsets, then the sum of their sizes is at most `n`
times how many they are. -/
theorem sum_card_le [Fintype α] (h : ∀ a, (B.filter <| (· ∈ ·) a).card ≤ n) :
- (∑ s in B, s.card) ≤ Fintype.card α * n :=
+ ∑ s in B, s.card ≤ Fintype.card α * n :=
calc
- (∑ s in B, s.card) = ∑ s in B, (univ ∩ s).card := by simp_rw [univ_inter]
+ ∑ s in B, s.card = ∑ s in B, (univ ∩ s).card := by simp_rw [univ_inter]
_ ≤ Fintype.card α * n := sum_card_inter_le fun a _ ↦ h a
#align finset.sum_card_le Finset.sum_card_le
@@ -362,7 +362,7 @@ theorem sum_card_inter (h : ∀ a ∈ s, (B.filter <| (· ∈ ·) a).card = n) :
/-- If every element belongs to exactly `n` Finsets, then the sum of their sizes is `n` times how
many they are. -/
theorem sum_card [Fintype α] (h : ∀ a, (B.filter <| (· ∈ ·) a).card = n) :
- (∑ s in B, s.card) = Fintype.card α * n := by
+ ∑ s in B, s.card = Fintype.card α * n := by
simp_rw [Fintype.card, ← sum_card_inter fun a _ ↦ h a, univ_inter]
#align finset.sum_card Finset.sum_card
@@ -398,13 +398,13 @@ section CanonicallyOrderedMonoid
variable [CanonicallyOrderedMonoid M] {f : ι → M} {s t : Finset ι}
@[to_additive (attr := simp) sum_eq_zero_iff]
-theorem prod_eq_one_iff' : (∏ x in s, f x) = 1 ↔ ∀ x ∈ s, f x = 1 :=
+theorem prod_eq_one_iff' : ∏ x in s, f x = 1 ↔ ∀ x ∈ s, f x = 1 :=
prod_eq_one_iff_of_one_le' fun x _ ↦ one_le (f x)
#align finset.prod_eq_one_iff' Finset.prod_eq_one_iff'
#align finset.sum_eq_zero_iff Finset.sum_eq_zero_iff
@[to_additive sum_le_sum_of_subset]
-theorem prod_le_prod_of_subset' (h : s ⊆ t) : (∏ x in s, f x) ≤ ∏ x in t, f x :=
+theorem prod_le_prod_of_subset' (h : s ⊆ t) : ∏ x in s, f x ≤ ∏ x in t, f x :=
prod_le_prod_of_subset_of_one_le' h fun _ _ _ ↦ one_le _
#align finset.prod_le_prod_of_subset' Finset.prod_le_prod_of_subset'
#align finset.sum_le_sum_of_subset Finset.sum_le_sum_of_subset
@@ -417,9 +417,9 @@ theorem prod_mono_set' (f : ι → M) : Monotone fun s ↦ ∏ x in s, f x := fu
@[to_additive sum_le_sum_of_ne_zero]
theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) :
- (∏ x in s, f x) ≤ ∏ x in t, f x := by
+ ∏ x in s, f x ≤ ∏ x in t, f x := by
classical calc
- (∏ x in s, f x) = (∏ x in s.filter fun x ↦ f x = 1, f x) *
+ ∏ x in s, f x = (∏ x in s.filter fun x ↦ f x = 1, f x) *
∏ x in s.filter fun x ↦ f x ≠ 1, f x := by
rw [← prod_union, filter_union_filter_neg_eq]
exact disjoint_filter.2 fun _ _ h n_h ↦ n_h h
@@ -438,7 +438,7 @@ variable [OrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
@[to_additive sum_lt_sum]
theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i < g i) :
- (∏ i in s, f i) < ∏ i in s, g i := by
+ ∏ i in s, f i < ∏ i in s, g i := by
classical
rcases Hlt with ⟨i, hi, hlt⟩
rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
@@ -448,7 +448,7 @@ theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i <
@[to_additive sum_lt_sum_of_nonempty]
theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g i) :
- (∏ i in s, f i) < ∏ i in s, g i := by
+ ∏ i in s, f i < ∏ i in s, g i := by
apply prod_lt_prod'
· intro i hi
apply le_of_lt (Hlt i hi)
@@ -479,9 +479,9 @@ add_decl_doc GCongr.sum_lt_sum_of_nonempty
-- Porting note: TODO -- calc indentation
@[to_additive sum_lt_sum_of_subset]
theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i ∉ s) (hlt : 1 < f i)
- (hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : (∏ j in s, f j) < ∏ j in t, f j := by
+ (hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : ∏ j in s, f j < ∏ j in t, f j := by
classical calc
- (∏ j in s, f j) < ∏ j in insert i s, f j := by
+ ∏ j in s, f j < ∏ j in insert i s, f j := by
rw [prod_insert hs]
exact lt_mul_of_one_lt_left' (∏ j in s, f j) hlt
_ ≤ ∏ j in t, f j := by
@@ -511,7 +511,7 @@ theorem one_lt_prod (h : ∀ i ∈ s, 1 < f i) (hs : s.Nonempty) : 1 < ∏ i in
#align finset.sum_pos Finset.sum_pos
@[to_additive]
-theorem prod_lt_one (h : ∀ i ∈ s, f i < 1) (hs : s.Nonempty) : (∏ i in s, f i) < 1 :=
+theorem prod_lt_one (h : ∀ i ∈ s, f i < 1) (hs : s.Nonempty) : ∏ i in s, f i < 1 :=
(prod_lt_prod_of_nonempty' hs h).trans_le (by rw [prod_const_one])
#align finset.prod_lt_one Finset.prod_lt_one
#align finset.sum_neg Finset.sum_neg
@@ -523,7 +523,7 @@ theorem one_lt_prod' (h : ∀ i ∈ s, 1 ≤ f i) (hs : ∃ i ∈ s, 1 < f i) :
#align finset.sum_pos' Finset.sum_pos'
@[to_additive]
-theorem prod_lt_one' (h : ∀ i ∈ s, f i ≤ 1) (hs : ∃ i ∈ s, f i < 1) : (∏ i in s, f i) < 1 :=
+theorem prod_lt_one' (h : ∀ i ∈ s, f i ≤ 1) (hs : ∃ i ∈ s, f i < 1) : ∏ i in s, f i < 1 :=
prod_const_one.le.trans_lt' <| prod_lt_prod' h hs
#align finset.prod_lt_one' Finset.prod_lt_one'
#align finset.sum_neg' Finset.sum_neg'
@@ -550,14 +550,14 @@ section LinearOrderedCancelCommMonoid
variable [LinearOrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
@[to_additive exists_lt_of_sum_lt]
-theorem exists_lt_of_prod_lt' (Hlt : (∏ i in s, f i) < ∏ i in s, g i) : ∃ i ∈ s, f i < g i := by
+theorem exists_lt_of_prod_lt' (Hlt : ∏ i in s, f i < ∏ i in s, g i) : ∃ i ∈ s, f i < g i := by
contrapose! Hlt with Hle
exact prod_le_prod' Hle
#align finset.exists_lt_of_prod_lt' Finset.exists_lt_of_prod_lt'
#align finset.exists_lt_of_sum_lt Finset.exists_lt_of_sum_lt
@[to_additive exists_le_of_sum_le]
-theorem exists_le_of_prod_le' (hs : s.Nonempty) (Hle : (∏ i in s, f i) ≤ ∏ i in s, g i) :
+theorem exists_le_of_prod_le' (hs : s.Nonempty) (Hle : ∏ i in s, f i ≤ ∏ i in s, g i) :
∃ i ∈ s, f i ≤ g i := by
contrapose! Hle with Hlt
exact prod_lt_prod_of_nonempty' hs Hlt
@@ -565,13 +565,13 @@ theorem exists_le_of_prod_le' (hs : s.Nonempty) (Hle : (∏ i in s, f i) ≤ ∏
#align finset.exists_le_of_sum_le Finset.exists_le_of_sum_le
@[to_additive exists_pos_of_sum_zero_of_exists_nonzero]
-theorem exists_one_lt_of_prod_one_of_exists_ne_one' (f : ι → M) (h₁ : (∏ i in s, f i) = 1)
+theorem exists_one_lt_of_prod_one_of_exists_ne_one' (f : ι → M) (h₁ : ∏ i in s, f i = 1)
(h₂ : ∃ i ∈ s, f i ≠ 1) : ∃ i ∈ s, 1 < f i := by
contrapose! h₁
obtain ⟨i, m, i_ne⟩ : ∃ i ∈ s, f i ≠ 1 := h₂
apply ne_of_lt
calc
- (∏ j in s, f j) < ∏ j in s, 1 := prod_lt_prod' h₁ ⟨i, m, (h₁ i m).lt_of_ne i_ne⟩
+ ∏ j in s, f j < ∏ j in s, 1 := prod_lt_prod' h₁ ⟨i, m, (h₁ i m).lt_of_ne i_ne⟩
_ = 1 := prod_const_one
#align finset.exists_one_lt_of_prod_one_of_exists_ne_one' Finset.exists_one_lt_of_prod_one_of_exists_ne_one'
#align finset.exists_pos_of_sum_zero_of_exists_nonzero Finset.exists_pos_of_sum_zero_of_exists_nonzero
@@ -593,7 +593,7 @@ theorem prod_nonneg (h0 : ∀ i ∈ s, 0 ≤ f i) : 0 ≤ ∏ i in s, f i :=
product of `f i` is less than or equal to the product of `g i`. See also `Finset.prod_le_prod'` for
the case of an ordered commutative multiplicative monoid. -/
theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g i) :
- (∏ i in s, f i) ≤ ∏ i in s, g i := by
+ ∏ i in s, f i ≤ ∏ i in s, g i := by
induction' s using Finset.induction with a s has ih h
· simp
· simp only [prod_insert has]
@@ -616,7 +616,7 @@ theorem _root_.GCongr.prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈
/-- If each `f i`, `i ∈ s` belongs to `[0, 1]`, then their product is less than or equal to one.
See also `Finset.prod_le_one'` for the case of an ordered commutative multiplicative monoid. -/
-theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 := by
+theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1) : ∏ i in s, f i ≤ 1 := by
convert ← prod_le_prod h0 h1
exact Finset.prod_const_one
#align finset.prod_le_one Finset.prod_le_one
@@ -710,26 +710,26 @@ open Finset
/-- A product of finite numbers is still finite -/
theorem prod_lt_top [CommMonoidWithZero R] [NoZeroDivisors R] [Nontrivial R] [DecidableEq R] [LT R]
- {s : Finset ι} {f : ι → WithTop R} (h : ∀ i ∈ s, f i ≠ ⊤) : (∏ i in s, f i) < ⊤ :=
+ {s : Finset ι} {f : ι → WithTop R} (h : ∀ i ∈ s, f i ≠ ⊤) : ∏ i in s, f i < ⊤ :=
prod_induction f (fun a ↦ a < ⊤) (fun _ _ h₁ h₂ ↦ mul_lt_top' h₁ h₂) (coe_lt_top 1)
fun a ha ↦ WithTop.lt_top_iff_ne_top.2 (h a ha)
#align with_top.prod_lt_top WithTop.prod_lt_top
/-- A sum of numbers is infinite iff one of them is infinite -/
theorem sum_eq_top_iff [AddCommMonoid M] {s : Finset ι} {f : ι → WithTop M} :
- (∑ i in s, f i) = ⊤ ↔ ∃ i ∈ s, f i = ⊤ := by
+ ∑ i in s, f i = ⊤ ↔ ∃ i ∈ s, f i = ⊤ := by
induction s using Finset.cons_induction <;> simp [*]
#align with_top.sum_eq_top_iff WithTop.sum_eq_top_iff
/-- A sum of finite numbers is still finite -/
theorem sum_lt_top_iff [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M} :
- (∑ i in s, f i) < ⊤ ↔ ∀ i ∈ s, f i < ⊤ := by
+ ∑ i in s, f i < ⊤ ↔ ∀ i ∈ s, f i < ⊤ := by
simp only [WithTop.lt_top_iff_ne_top, ne_eq, sum_eq_top_iff, not_exists, not_and]
#align with_top.sum_lt_top_iff WithTop.sum_lt_top_iff
/-- A sum of finite numbers is still finite -/
theorem sum_lt_top [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M}
- (h : ∀ i ∈ s, f i ≠ ⊤) : (∑ i in s, f i) < ⊤ :=
+ (h : ∀ i ∈ s, f i ≠ ⊤) : ∑ i in s, f i < ⊤ :=
sum_lt_top_iff.2 fun i hi => WithTop.lt_top_iff_ne_top.2 (h i hi)
#align with_top.sum_lt_top WithTop.sum_lt_top
Currently, (for both Set
and Finset
) insert_subset
is an iff
lemma stating that insert a s ⊆ t
if and only if a ∈ t
and s ⊆ t
. For both types, this PR renames this lemma to insert_subset_iff
, and adds an insert_subset
lemma that gives the implication just in the reverse direction : namely theorem insert_subset (ha : a ∈ t) (hs : s ⊆ t) : insert a s ⊆ t
.
This both aligns the naming with union_subset
and union_subset_iff
, and removes the need for the awkward insert_subset.mpr ⟨_,_⟩
idiom. It touches a lot of files (too many to list), but in a trivial way.
@@ -486,7 +486,7 @@ theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i
exact lt_mul_of_one_lt_left' (∏ j in s, f j) hlt
_ ≤ ∏ j in t, f j := by
apply prod_le_prod_of_subset_of_one_le'
- · simp [Finset.insert_subset, h, ht]
+ · simp [Finset.insert_subset_iff, h, ht]
· intro x hx h'x
simp only [mem_insert, not_or] at h'x
exact hle x hx h'x.2
@@ -584,7 +584,7 @@ variable [OrderedCommSemiring R] {f g : ι → R} {s t : Finset ι}
open Classical
--- this is also true for a ordered commutative multiplicative monoid with zero
+-- this is also true for an ordered commutative multiplicative monoid with zero
theorem prod_nonneg (h0 : ∀ i ∈ s, 0 ≤ f i) : 0 ≤ ∏ i in s, f i :=
prod_induction f (fun i ↦ 0 ≤ i) (fun _ _ ha hb ↦ mul_nonneg ha hb) zero_le_one h0
#align finset.prod_nonneg Finset.prod_nonneg
@@ -647,7 +647,7 @@ section StrictOrderedCommSemiring
variable [StrictOrderedCommSemiring R] [Nontrivial R] {f : ι → R} {s : Finset ι}
--- This is also true for a ordered commutative multiplicative monoid with zero
+-- This is also true for an ordered commutative multiplicative monoid with zero
theorem prod_pos (h0 : ∀ i ∈ s, 0 < f i) : 0 < ∏ i in s, f i :=
prod_induction f (fun x ↦ 0 < x) (fun _ _ ha hb ↦ mul_pos ha hb) zero_lt_one h0
#align finset.prod_pos Finset.prod_pos
@@ -397,7 +397,7 @@ section CanonicallyOrderedMonoid
variable [CanonicallyOrderedMonoid M] {f : ι → M} {s t : Finset ι}
-@[to_additive (attr:=simp) sum_eq_zero_iff]
+@[to_additive (attr := simp) sum_eq_zero_iff]
theorem prod_eq_one_iff' : (∏ x in s, f x) = 1 ↔ ∀ x ∈ s, f x = 1 :=
prod_eq_one_iff_of_one_le' fun x _ ↦ one_le (f x)
#align finset.prod_eq_one_iff' Finset.prod_eq_one_iff'
gcongr
for "relational congruence" (#3965)
This PR implements a new tactic, gcongr
, which applies "relational congruence" rules, reducing a relational goal between a LHS and RHS matching the same pattern to relational subgoals between the differing inputs to the pattern. For example,
example {a b x c d : ℝ} (h1 : a + 1 ≤ b + 1) (h2 : c + 2 ≤ d + 2) :
x ^ 4 * a + c ≤ x ^ 4 * b + d := by
gcongr
· linarith
· linarith
This example has the goal of proving the relation ≤
between a LHS and RHS both of the pattern
x ^ 4 * ?_ + ?_
(with inputs a
, c
on the left and b
, d
on the right); after the use of gcongr
, we have the simpler goals a ≤ b
and c ≤ d
.
For a sense of the style of argument facilitated by the tactic, this commit (which will be PR'd separately) gives >100 examples of use cases in the existing library.
The tactic's syntax allows for a pattern to be provided explicitly; this is useful if a non-maximal match is desired:
example {a b c d x : ℝ} (h : a + c + 1 ≤ b + d + 1) :
x ^ 4 * (a + c) + 5 ≤ x ^ 4 * (b + d) + 5 := by
gcongr x ^ 4 * ?_ + 5
linarith
This feature is the analogue for general relations of the mathlib3 congrm
tactic.
The "relational congruence" rules used are the library lemmas which have been tagged with the attribute @[gcongr]
. For example, the first example constructs the proof term
add_le_add (mul_le_mul_of_nonneg_left _ (pow_bit0_nonneg x 2)) _
using the relational congruence lemmas add_le_add
and mul_le_mul_of_nonneg_left
. In this initial implementation, the @[gcongr]
tagging has been set up for arithmetic head functions (+
, *
etc) and the relations ≤
, <
and congruence-mod-n
.
The tactic attempts to discharge side goals to these "relational congruence" lemmas (such as the side goal 0 ≤ x ^ 4
in the above application of mul_le_mul_of_nonneg_left
) using the tactic gcongr_discharger
, which wraps positivity
but can also be extended. Side goals not discharged in this way are left for the user.
Co-authored-by: Mario Carneiro <di.gama@gmail.com>
Co-authored-by: Mario Carneiro <di.gama@gmail.com> Co-authored-by: Moritz Doll <moritz.doll@googlemail.com>
@@ -12,6 +12,7 @@ import Mathlib.Algebra.Order.AbsoluteValue
import Mathlib.Algebra.Order.Ring.WithTop
import Mathlib.Algebra.BigOperators.Basic
import Mathlib.Data.Fintype.Card
+import Mathlib.Tactic.GCongr.Core
/-!
# Results about big operators with values in an ordered algebraic structure.
@@ -121,6 +122,22 @@ or equal to the corresponding summand `g i` of another finite sum, then
`∑ i in s, f i ≤ ∑ i in s, g i`. -/
add_decl_doc sum_le_sum
+/-- In an ordered commutative monoid, if each factor `f i` of one finite product is less than or
+equal to the corresponding factor `g i` of another finite product, then `s.prod f ≤ s.prod g`.
+
+This is a variant (beta-reduced) version of the standard lemma `Finset.prod_le_prod'`, convenient
+for the `gcongr` tactic. -/
+@[to_additive (attr := gcongr) GCongr.sum_le_sum]
+theorem _root_.GCongr.prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) : s.prod f ≤ s.prod g :=
+ s.prod_le_prod' h
+
+/-- In an ordered additive commutative monoid, if each summand `f i` of one finite sum is less than
+or equal to the corresponding summand `g i` of another finite sum, then `s.sum f ≤ s.sum g`.
+
+This is a variant (beta-reduced) version of the standard lemma `Finset.sum_le_sum`, convenient
+for the `gcongr` tactic. -/
+add_decl_doc GCongr.sum_le_sum
+
@[to_additive sum_nonneg]
theorem one_le_prod' (h : ∀ i ∈ s, 1 ≤ f i) : 1 ≤ ∏ i in s, f i :=
le_trans (by rw [prod_const_one]) (prod_le_prod' h)
@@ -440,6 +457,25 @@ theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g
#align finset.prod_lt_prod_of_nonempty' Finset.prod_lt_prod_of_nonempty'
#align finset.sum_lt_sum_of_nonempty Finset.sum_lt_sum_of_nonempty
+/-- In an ordered commutative monoid, if each factor `f i` of one nontrivial finite product is
+strictly less than the corresponding factor `g i` of another nontrivial finite product, then
+`s.prod f < s.prod g`.
+
+This is a variant (beta-reduced) version of the standard lemma `Finset.prod_lt_prod_of_nonempty'`,
+convenient for the `gcongr` tactic. -/
+@[to_additive (attr := gcongr) GCongr.sum_lt_sum_of_nonempty]
+theorem _root_.GCongr.prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g i) :
+ s.prod f < s.prod g :=
+ s.prod_lt_prod_of_nonempty' hs Hlt
+
+/-- In an ordered additive commutative monoid, if each summand `f i` of one nontrivial finite sum is
+strictly less than the corresponding summand `g i` of another nontrivial finite sum, then
+`s.sum f < s.sum g`.
+
+This is a variant (beta-reduced) version of the standard lemma `Finset.sum_lt_sum_of_nonempty`,
+convenient for the `gcongr` tactic. -/
+add_decl_doc GCongr.sum_lt_sum_of_nonempty
+
-- Porting note: TODO -- calc indentation
@[to_additive sum_lt_sum_of_subset]
theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i ∉ s) (hlt : 1 < f i)
@@ -568,6 +604,16 @@ theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g
· apply le_trans (h0 a (mem_insert_self a s)) (h1 a (mem_insert_self a s))
#align finset.prod_le_prod Finset.prod_le_prod
+/-- If all `f i`, `i ∈ s`, are nonnegative and each `f i` is less than or equal to `g i`, then the
+product of `f i` is less than or equal to the product of `g i`.
+
+This is a variant (beta-reduced) version of the standard lemma `Finset.prod_le_prod`, convenient
+for the `gcongr` tactic. -/
+@[gcongr]
+theorem _root_.GCongr.prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g i) :
+ s.prod f ≤ s.prod g :=
+ s.prod_le_prod h0 h1
+
/-- If each `f i`, `i ∈ s` belongs to `[0, 1]`, then their product is less than or equal to one.
See also `Finset.prod_le_one'` for the case of an ordered commutative multiplicative monoid. -/
theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 := by
fix-comments.py
on all files.@@ -569,7 +569,7 @@ theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g
#align finset.prod_le_prod Finset.prod_le_prod
/-- If each `f i`, `i ∈ s` belongs to `[0, 1]`, then their product is less than or equal to one.
-See also `finset.prod_le_one'` for the case of an ordered commutative multiplicative monoid. -/
+See also `Finset.prod_le_one'` for the case of an ordered commutative multiplicative monoid. -/
theorem prod_le_one (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 := by
convert ← prod_le_prod h0 h1
exact Finset.prod_const_one
sSup
/iSup
(#3938)
As discussed on Zulip
supₛ
→ sSup
infₛ
→ sInf
supᵢ
→ iSup
infᵢ
→ iInf
bsupₛ
→ bsSup
binfₛ
→ bsInf
bsupᵢ
→ biSup
binfᵢ
→ biInf
csupₛ
→ csSup
cinfₛ
→ csInf
csupᵢ
→ ciSup
cinfᵢ
→ ciInf
unionₛ
→ sUnion
interₛ
→ sInter
unionᵢ
→ iUnion
interᵢ
→ iInter
bunionₛ
→ bsUnion
binterₛ
→ bsInter
bunionᵢ
→ biUnion
binterᵢ
→ biInter
Co-authored-by: Parcly Taxel <reddeloostw@gmail.com>
@@ -210,10 +210,10 @@ theorem pow_card_le_prod (s : Finset ι) (f : ι → N) (n : N) (h : ∀ x ∈ s
#align finset.pow_card_le_prod Finset.pow_card_le_prod
#align finset.card_nsmul_le_sum Finset.card_nsmul_le_sum
-theorem card_bunionᵢ_le_card_mul [DecidableEq β] (s : Finset ι) (f : ι → Finset β) (n : ℕ)
- (h : ∀ a ∈ s, (f a).card ≤ n) : (s.bunionᵢ f).card ≤ s.card * n :=
- card_bunionᵢ_le.trans <| sum_le_card_nsmul _ _ _ h
-#align finset.card_bUnion_le_card_mul Finset.card_bunionᵢ_le_card_mul
+theorem card_biUnion_le_card_mul [DecidableEq β] (s : Finset ι) (f : ι → Finset β) (n : ℕ)
+ (h : ∀ a ∈ s, (f a).card ≤ n) : (s.biUnion f).card ≤ s.card * n :=
+ card_biUnion_le.trans <| sum_le_card_nsmul _ _ _ h
+#align finset.card_bUnion_le_card_mul Finset.card_biUnion_le_card_mul
variable {ι' : Type _} [DecidableEq ι']
@@ -349,30 +349,30 @@ theorem sum_card [Fintype α] (h : ∀ a, (B.filter <| (· ∈ ·) a).card = n)
simp_rw [Fintype.card, ← sum_card_inter fun a _ ↦ h a, univ_inter]
#align finset.sum_card Finset.sum_card
-theorem card_le_card_bunionᵢ {s : Finset ι} {f : ι → Finset α} (hs : (s : Set ι).PairwiseDisjoint f)
- (hf : ∀ i ∈ s, (f i).Nonempty) : s.card ≤ (s.bunionᵢ f).card := by
- rw [card_bunionᵢ hs, card_eq_sum_ones]
+theorem card_le_card_biUnion {s : Finset ι} {f : ι → Finset α} (hs : (s : Set ι).PairwiseDisjoint f)
+ (hf : ∀ i ∈ s, (f i).Nonempty) : s.card ≤ (s.biUnion f).card := by
+ rw [card_biUnion hs, card_eq_sum_ones]
exact sum_le_sum fun i hi ↦ (hf i hi).card_pos
-#align finset.card_le_card_bUnion Finset.card_le_card_bunionᵢ
+#align finset.card_le_card_bUnion Finset.card_le_card_biUnion
-theorem card_le_card_bunionᵢ_add_card_fiber {s : Finset ι} {f : ι → Finset α}
+theorem card_le_card_biUnion_add_card_fiber {s : Finset ι} {f : ι → Finset α}
(hs : (s : Set ι).PairwiseDisjoint f) :
- s.card ≤ (s.bunionᵢ f).card + (s.filter fun i ↦ f i = ∅).card := by
+ s.card ≤ (s.biUnion f).card + (s.filter fun i ↦ f i = ∅).card := by
rw [← Finset.filter_card_add_filter_neg_card_eq_card fun i ↦ f i = ∅, add_comm]
exact
add_le_add_right
- ((card_le_card_bunionᵢ (hs.subset <| filter_subset _ _) fun i hi ↦
+ ((card_le_card_biUnion (hs.subset <| filter_subset _ _) fun i hi ↦
nonempty_of_ne_empty <| (mem_filter.1 hi).2).trans <|
- card_le_of_subset <| bunionᵢ_subset_bunionᵢ_of_subset_left _ <| filter_subset _ _)
+ card_le_of_subset <| biUnion_subset_biUnion_of_subset_left _ <| filter_subset _ _)
_
-#align finset.card_le_card_bUnion_add_card_fiber Finset.card_le_card_bunionᵢ_add_card_fiber
+#align finset.card_le_card_bUnion_add_card_fiber Finset.card_le_card_biUnion_add_card_fiber
-theorem card_le_card_bunionᵢ_add_one {s : Finset ι} {f : ι → Finset α} (hf : Injective f)
- (hs : (s : Set ι).PairwiseDisjoint f) : s.card ≤ (s.bunionᵢ f).card + 1 :=
- (card_le_card_bunionᵢ_add_card_fiber hs).trans <|
+theorem card_le_card_biUnion_add_one {s : Finset ι} {f : ι → Finset α} (hf : Injective f)
+ (hs : (s : Set ι).PairwiseDisjoint f) : s.card ≤ (s.biUnion f).card + 1 :=
+ (card_le_card_biUnion_add_card_fiber hs).trans <|
add_le_add_left
(card_le_one.2 fun _ hi _ hj ↦ hf <| (mem_filter.1 hi).2.trans (mem_filter.1 hj).2.symm) _
-#align finset.card_le_card_bUnion_add_one Finset.card_le_card_bunionᵢ_add_one
+#align finset.card_le_card_bUnion_add_one Finset.card_le_card_biUnion_add_one
end DoubleCounting
by
s! (#3825)
This PR puts, with one exception, every single remaining by
that lies all by itself on its own line to the previous line, thus matching the current behaviour of start-port.sh
. The exception is when the by
begins the second or later argument to a tuple or anonymous constructor; see https://github.com/leanprover-community/mathlib4/pull/3825#discussion_r1186702599.
Essentially this is s/\n *by$/ by/g
, but with manual editing to satisfy the linter's max-100-char-line requirement. The Python style linter is also modified to catch these "isolated by
s".
@@ -399,18 +399,17 @@ theorem prod_mono_set' (f : ι → M) : Monotone fun s ↦ ∏ x in s, f x := fu
#align finset.sum_mono_set Finset.sum_mono_set
@[to_additive sum_le_sum_of_ne_zero]
-theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : (∏ x in s, f x) ≤ ∏ x in t, f x :=
- by
+theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) :
+ (∏ x in s, f x) ≤ ∏ x in t, f x := by
classical calc
- (∏ x in s, f x) =
- (∏ x in s.filter fun x ↦ f x = 1, f x) * ∏ x in s.filter fun x ↦ f x ≠ 1, f x :=
- by
- rw [← prod_union, filter_union_filter_neg_eq]
- exact disjoint_filter.2 fun _ _ h n_h ↦ n_h h
- _ ≤ ∏ x in t, f x :=
- mul_le_of_le_one_of_le
- (prod_le_one' <| by simp only [mem_filter, and_imp] ; exact fun _ _ ↦ le_of_eq)
- (prod_le_prod_of_subset' <| by simpa only [subset_iff, mem_filter, and_imp] )
+ (∏ x in s, f x) = (∏ x in s.filter fun x ↦ f x = 1, f x) *
+ ∏ x in s.filter fun x ↦ f x ≠ 1, f x := by
+ rw [← prod_union, filter_union_filter_neg_eq]
+ exact disjoint_filter.2 fun _ _ h n_h ↦ n_h h
+ _ ≤ ∏ x in t, f x :=
+ mul_le_of_le_one_of_le
+ (prod_le_one' <| by simp only [mem_filter, and_imp] ; exact fun _ _ ↦ le_of_eq)
+ (prod_le_prod_of_subset' <| by simpa only [subset_iff, mem_filter, and_imp] )
#align finset.prod_le_prod_of_ne_one' Finset.prod_le_prod_of_ne_one'
#align finset.sum_le_sum_of_ne_zero Finset.sum_le_sum_of_ne_zero
@@ -446,17 +445,15 @@ theorem prod_lt_prod_of_nonempty' (hs : s.Nonempty) (Hlt : ∀ i ∈ s, f i < g
theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i ∉ s) (hlt : 1 < f i)
(hle : ∀ j ∈ t, j ∉ s → 1 ≤ f j) : (∏ j in s, f j) < ∏ j in t, f j := by
classical calc
- (∏ j in s, f j) < ∏ j in insert i s, f j :=
- by
- rw [prod_insert hs]
- exact lt_mul_of_one_lt_left' (∏ j in s, f j) hlt
- _ ≤ ∏ j in t, f j :=
- by
- apply prod_le_prod_of_subset_of_one_le'
- · simp [Finset.insert_subset, h, ht]
- · intro x hx h'x
- simp only [mem_insert, not_or] at h'x
- exact hle x hx h'x.2
+ (∏ j in s, f j) < ∏ j in insert i s, f j := by
+ rw [prod_insert hs]
+ exact lt_mul_of_one_lt_left' (∏ j in s, f j) hlt
+ _ ≤ ∏ j in t, f j := by
+ apply prod_le_prod_of_subset_of_one_le'
+ · simp [Finset.insert_subset, h, ht]
+ · intro x hx h'x
+ simp only [mem_insert, not_or] at h'x
+ exact hle x hx h'x.2
#align finset.prod_lt_prod_of_subset' Finset.prod_lt_prod_of_subset'
#align finset.sum_lt_sum_of_subset Finset.sum_lt_sum_of_subset
This PR fixes two things:
align
statements for definitions and theorems and instances that are separated by two newlines from the relevant declaration (s/\n\n#align/\n#align
). This is often seen in the mathport output after ending calc
blocks.#align
statements. (This was needed for a script I wrote for #3630.)@@ -46,9 +46,7 @@ theorem le_prod_nonempty_of_submultiplicative_on_pred (f : M → N) (p : M → P
· exact Multiset.forall_mem_map_iff.mpr hs
rw [Multiset.map_map]
rfl
-#align
- finset.le_prod_nonempty_of_submultiplicative_on_pred
- Finset.le_prod_nonempty_of_submultiplicative_on_pred
+#align finset.le_prod_nonempty_of_submultiplicative_on_pred Finset.le_prod_nonempty_of_submultiplicative_on_pred
#align finset.le_sum_nonempty_of_subadditive_on_pred Finset.le_sum_nonempty_of_subadditive_on_pred
/-- Let `{x | p x}` be an additive subsemigroup of an additive commutative monoid `M`. Let
@@ -149,7 +147,6 @@ theorem prod_le_prod_of_subset_of_one_le' (h : s ⊆ t) (hf : ∀ i ∈ t, i ∉
le_mul_of_one_le_left' <| one_le_prod' <| by simpa only [mem_sdiff, and_imp]
_ = ∏ i in t \ s ∪ s, f i := (prod_union sdiff_disjoint).symm
_ = ∏ i in t, f i := by rw [sdiff_union_of_subset h]
-
#align finset.prod_le_prod_of_subset_of_one_le' Finset.prod_le_prod_of_subset_of_one_le'
#align finset.sum_le_sum_of_subset_of_nonneg Finset.sum_le_sum_of_subset_of_nonneg
@@ -194,7 +191,6 @@ theorem single_le_prod' (hf : ∀ i ∈ s, 1 ≤ f i) {a} (h : a ∈ s) : f a
f a = ∏ i in {a}, f i := prod_singleton.symm
_ ≤ ∏ i in s, f i :=
prod_le_prod_of_subset_of_one_le' (singleton_subset_iff.2 h) fun i hi _ ↦ hf i hi
-
#align finset.single_le_prod' Finset.single_le_prod'
#align finset.single_le_sum Finset.single_le_sum
@@ -232,12 +228,8 @@ theorem prod_fiberwise_le_prod_of_one_le_prod_fiber' {t : Finset ι'} {g : ι
prod_le_prod_of_subset_of_one_le' (subset_union_left _ _) fun y _ ↦ h y
_ = ∏ x in s, f x :=
prod_fiberwise_of_maps_to (fun _ hx ↦ mem_union.2 <| Or.inr <| mem_image_of_mem _ hx) _
-
-#align
- finset.prod_fiberwise_le_prod_of_one_le_prod_fiber'
- Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber'
-#align
- finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg Finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg
+#align finset.prod_fiberwise_le_prod_of_one_le_prod_fiber' Finset.prod_fiberwise_le_prod_of_one_le_prod_fiber'
+#align finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg Finset.sum_fiberwise_le_sum_of_sum_fiber_nonneg
-- Porting note: Mathport warning: expanding binder collection (y «expr ∉ » t)
@[to_additive sum_le_sum_fiberwise_of_sum_fiber_nonpos]
@@ -245,11 +237,8 @@ theorem prod_le_prod_fiberwise_of_prod_fiber_le_one' {t : Finset ι'} {g : ι
(h : ∀ (y) (_ : y ∉ t), (∏ x in s.filter fun x ↦ g x = y, f x) ≤ 1) :
(∏ x in s, f x) ≤ ∏ y in t, ∏ x in s.filter fun x ↦ g x = y, f x :=
@prod_fiberwise_le_prod_of_one_le_prod_fiber' _ Nᵒᵈ _ _ _ _ _ _ _ h
-#align
- finset.prod_le_prod_fiberwise_of_prod_fiber_le_one'
- Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one'
-#align
- finset.sum_le_sum_fiberwise_of_sum_fiber_nonpos Finset.sum_le_sum_fiberwise_of_sum_fiber_nonpos
+#align finset.prod_le_prod_fiberwise_of_prod_fiber_le_one' Finset.prod_le_prod_fiberwise_of_prod_fiber_le_one'
+#align finset.sum_le_sum_fiberwise_of_sum_fiber_nonpos Finset.sum_le_sum_fiberwise_of_sum_fiber_nonpos
end OrderedCommMonoid
@@ -283,7 +272,6 @@ theorem card_le_mul_card_image_of_maps_to {f : α → β} {s : Finset α} {t : F
s.card = ∑ a in t, (s.filter fun x ↦ f x = a).card := card_eq_sum_card_fiberwise Hf
_ ≤ ∑ _a in t, n := sum_le_sum hn
_ = _ := by simp [mul_comm]
-
#align finset.card_le_mul_card_image_of_maps_to Finset.card_le_mul_card_image_of_maps_to
theorem card_le_mul_card_image {f : α → β} (s : Finset α) (n : ℕ)
@@ -298,7 +286,6 @@ theorem mul_card_image_le_card_of_maps_to {f : α → β} {s : Finset α} {t : F
n * t.card = ∑ _a in t, n := by simp [mul_comm]
_ ≤ ∑ a in t, (s.filter fun x ↦ f x = a).card := sum_le_sum hn
_ = s.card := by rw [← card_eq_sum_card_fiberwise Hf]
-
#align finset.mul_card_image_le_card_of_maps_to Finset.mul_card_image_le_card_of_maps_to
theorem mul_card_image_le_card {f : α → β} (s : Finset α) (n : ℕ)
@@ -328,7 +315,6 @@ theorem sum_card_le [Fintype α] (h : ∀ a, (B.filter <| (· ∈ ·) a).card
calc
(∑ s in B, s.card) = ∑ s in B, (univ ∩ s).card := by simp_rw [univ_inter]
_ ≤ Fintype.card α * n := sum_card_inter_le fun a _ ↦ h a
-
#align finset.sum_card_le Finset.sum_card_le
/-- If every element belongs to at least `n` Finsets, then the sum of their sizes is at least `n`
@@ -347,7 +333,6 @@ theorem le_sum_card [Fintype α] (h : ∀ a, n ≤ (B.filter <| (· ∈ ·) a).c
calc
Fintype.card α * n ≤ ∑ s in B, (univ ∩ s).card := le_sum_card_inter fun a _ ↦ h a
_ = ∑ s in B, s.card := by simp_rw [univ_inter]
-
#align finset.le_sum_card Finset.le_sum_card
/-- If every element belongs to exactly `n` Finsets, then the sum of their sizes is `n` times how
@@ -426,7 +411,6 @@ theorem prod_le_prod_of_ne_one' (h : ∀ x ∈ s, f x ≠ 1 → x ∈ t) : (∏
mul_le_of_le_one_of_le
(prod_le_one' <| by simp only [mem_filter, and_imp] ; exact fun _ _ ↦ le_of_eq)
(prod_le_prod_of_subset' <| by simpa only [subset_iff, mem_filter, and_imp] )
-
#align finset.prod_le_prod_of_ne_one' Finset.prod_le_prod_of_ne_one'
#align finset.sum_le_sum_of_ne_zero Finset.sum_le_sum_of_ne_zero
@@ -473,7 +457,6 @@ theorem prod_lt_prod_of_subset' (h : s ⊆ t) {i : ι} (ht : i ∈ t) (hs : i
· intro x hx h'x
simp only [mem_insert, not_or] at h'x
exact hle x hx h'x.2
-
#align finset.prod_lt_prod_of_subset' Finset.prod_lt_prod_of_subset'
#align finset.sum_lt_sum_of_subset Finset.sum_lt_sum_of_subset
@@ -485,7 +468,6 @@ theorem single_lt_prod' {i j : ι} (hij : j ≠ i) (hi : i ∈ s) (hj : j ∈ s)
_ < ∏ k in s, f k :=
prod_lt_prod_of_subset' (singleton_subset_iff.2 hi) hj (mt mem_singleton.1 hij) hlt
fun k hks hki ↦ hle k hks (mt mem_singleton.2 hki)
-
#align finset.single_lt_prod' Finset.single_lt_prod'
#align finset.single_lt_sum Finset.single_lt_sum
@@ -558,12 +540,8 @@ theorem exists_one_lt_of_prod_one_of_exists_ne_one' (f : ι → M) (h₁ : (∏
calc
(∏ j in s, f j) < ∏ j in s, 1 := prod_lt_prod' h₁ ⟨i, m, (h₁ i m).lt_of_ne i_ne⟩
_ = 1 := prod_const_one
-
-#align
- finset.exists_one_lt_of_prod_one_of_exists_ne_one'
- Finset.exists_one_lt_of_prod_one_of_exists_ne_one'
-#align
- finset.exists_pos_of_sum_zero_of_exists_nonzero Finset.exists_pos_of_sum_zero_of_exists_nonzero
+#align finset.exists_one_lt_of_prod_one_of_exists_ne_one' Finset.exists_one_lt_of_prod_one_of_exists_ne_one'
+#align finset.exists_pos_of_sum_zero_of_exists_nonzero Finset.exists_pos_of_sum_zero_of_exists_nonzero
end LinearOrderedCancelCommMonoid
@@ -667,16 +667,12 @@ namespace Fintype
variable [Fintype ι]
--- Porting note: remove the attribute `mono` since tactic mono does not yet exist
-@[to_additive sum_mono]
+@[to_additive (attr := mono) sum_mono]
theorem prod_mono' [OrderedCommMonoid M] : Monotone fun f : ι → M ↦ ∏ i, f i := fun _ _ hfg ↦
Finset.prod_le_prod' fun x _ ↦ hfg x
#align fintype.prod_mono' Fintype.prod_mono'
#align fintype.sum_mono Fintype.sum_mono
--- Porting note: commented out the next line since tactic `mono` does not yet exist
--- attribute [mono] sum_mono
-
@[to_additive sum_strict_mono]
theorem prod_strict_mono' [OrderedCancelCommMonoid M] : StrictMono fun f : ι → M ↦ ∏ x, f x :=
fun _ _ hfg ↦
@@ -180,7 +180,7 @@ theorem prod_eq_one_iff_of_one_le' :
#align finset.prod_eq_one_iff_of_one_le' Finset.prod_eq_one_iff_of_one_le'
#align finset.sum_eq_zero_iff_of_nonneg Finset.sum_eq_zero_iff_of_nonneg
-@[to_additive sum_eq_zero_iff_of_nonneg]
+@[to_additive existing sum_eq_zero_iff_of_nonneg]
theorem prod_eq_one_iff_of_le_one' :
(∀ i ∈ s, f i ≤ 1) → ((∏ i in s, f i) = 1 ↔ ∀ i ∈ s, f i = 1) :=
@prod_eq_one_iff_of_one_le' _ Nᵒᵈ _ _ _
Mathlib 3 version is leanprover-community/mathlib#18504
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
! This file was ported from Lean 3 source module algebra.big_operators.order
-! leanprover-community/mathlib commit afdb4fa3b32d41106a4a09b371ce549ad7958abd
+! leanprover-community/mathlib commit 824f9ae93a4f5174d2ea948e2d75843dd83447bb
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -113,9 +113,9 @@ variable {f g : ι → N} {s t : Finset ι}
equal to the corresponding factor `g i` of another finite product, then
`∏ i in s, f i ≤ ∏ i in s, g i`. -/
@[to_additive sum_le_sum]
-theorem prod_le_prod'' (h : ∀ i ∈ s, f i ≤ g i) : (∏ i in s, f i) ≤ ∏ i in s, g i :=
+theorem prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) : (∏ i in s, f i) ≤ ∏ i in s, g i :=
Multiset.prod_map_le_prod_map f g h
-#align finset.prod_le_prod'' Finset.prod_le_prod''
+#align finset.prod_le_prod' Finset.prod_le_prod'
#align finset.sum_le_sum Finset.sum_le_sum
/-- In an ordered additive commutative monoid, if each summand `f i` of one finite sum is less than
@@ -125,7 +125,7 @@ add_decl_doc sum_le_sum
@[to_additive sum_nonneg]
theorem one_le_prod' (h : ∀ i ∈ s, 1 ≤ f i) : 1 ≤ ∏ i in s, f i :=
- le_trans (by rw [prod_const_one]) (prod_le_prod'' h)
+ le_trans (by rw [prod_const_one]) (prod_le_prod' h)
#align finset.one_le_prod' Finset.one_le_prod'
#align finset.sum_nonneg Finset.sum_nonneg
@@ -137,7 +137,7 @@ theorem one_le_prod'' (h : ∀ i : ι, 1 ≤ f i) : 1 ≤ ∏ i : ι in s, f i :
@[to_additive sum_nonpos]
theorem prod_le_one' (h : ∀ i ∈ s, f i ≤ 1) : (∏ i in s, f i) ≤ 1 :=
- (prod_le_prod'' h).trans_eq (by rw [prod_const_one])
+ (prod_le_prod' h).trans_eq (by rw [prod_const_one])
#align finset.prod_le_one' Finset.prod_le_one'
#align finset.sum_nonpos Finset.sum_nonpos
@@ -442,7 +442,7 @@ theorem prod_lt_prod' (Hle : ∀ i ∈ s, f i ≤ g i) (Hlt : ∃ i ∈ s, f i <
classical
rcases Hlt with ⟨i, hi, hlt⟩
rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
- exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod'' fun j hj ↦ Hle j <| mem_of_mem_erase hj)
+ exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod' fun j hj ↦ Hle j <| mem_of_mem_erase hj)
#align finset.prod_lt_prod' Finset.prod_lt_prod'
#align finset.sum_lt_sum Finset.sum_lt_sum
@@ -524,7 +524,7 @@ theorem prod_eq_prod_iff_of_le {f g : ι → M} (h : ∀ i ∈ s, f i ≤ g i) :
rw [Finset.prod_insert ha, Finset.prod_insert ha, Finset.forall_mem_insert, ← ih]
exact
mul_eq_mul_iff_eq_and_eq (H a (s.mem_insert_self a))
- (Finset.prod_le_prod'' fun i ↦ H i ∘ Finset.mem_insert_of_mem)
+ (Finset.prod_le_prod' fun i ↦ H i ∘ Finset.mem_insert_of_mem)
#align finset.prod_eq_prod_iff_of_le Finset.prod_eq_prod_iff_of_le
#align finset.sum_eq_sum_iff_of_le Finset.sum_eq_sum_iff_of_le
@@ -537,7 +537,7 @@ variable [LinearOrderedCancelCommMonoid M] {f g : ι → M} {s t : Finset ι}
@[to_additive exists_lt_of_sum_lt]
theorem exists_lt_of_prod_lt' (Hlt : (∏ i in s, f i) < ∏ i in s, g i) : ∃ i ∈ s, f i < g i := by
contrapose! Hlt with Hle
- exact prod_le_prod'' Hle
+ exact prod_le_prod' Hle
#align finset.exists_lt_of_prod_lt' Finset.exists_lt_of_prod_lt'
#align finset.exists_lt_of_sum_lt Finset.exists_lt_of_sum_lt
@@ -579,7 +579,7 @@ theorem prod_nonneg (h0 : ∀ i ∈ s, 0 ≤ f i) : 0 ≤ ∏ i in s, f i :=
#align finset.prod_nonneg Finset.prod_nonneg
/-- If all `f i`, `i ∈ s`, are nonnegative and each `f i` is less than or equal to `g i`, then the
-product of `f i` is less than or equal to the product of `g i`. See also `Finset.prod_le_prod''` for
+product of `f i` is less than or equal to the product of `g i`. See also `Finset.prod_le_prod'` for
the case of an ordered commutative multiplicative monoid. -/
theorem prod_le_prod (h0 : ∀ i ∈ s, 0 ≤ f i) (h1 : ∀ i ∈ s, f i ≤ g i) :
(∏ i in s, f i) ≤ ∏ i in s, g i := by
@@ -643,16 +643,6 @@ variable [CanonicallyOrderedCommSemiring R] {f g h : ι → R} {s : Finset ι} {
CanonicallyOrderedCommSemiring.multiset_prod_pos.trans Multiset.forall_mem_map_iff
#align canonically_ordered_comm_semiring.prod_pos CanonicallyOrderedCommSemiring.prod_pos
-theorem prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) : (∏ i in s, f i) ≤ ∏ i in s, g i := by
- classical
- induction' s using Finset.induction with a s has ih h
- · simp
- · rw [Finset.prod_insert has, Finset.prod_insert has]
- apply mul_le_mul'
- · exact h _ (Finset.mem_insert_self a s)
- · exact ih fun i hi ↦ h _ (Finset.mem_insert_of_mem hi)
-#align finset.prod_le_prod' Finset.prod_le_prod'
-
/-- If `g, h ≤ f` and `g i + h i ≤ f i`, then the product of `f` over `s` is at least the
sum of the products of `g` and `h`. This is the version for `CanonicallyOrderedCommSemiring`.
-/
@@ -680,7 +670,7 @@ variable [Fintype ι]
-- Porting note: remove the attribute `mono` since tactic mono does not yet exist
@[to_additive sum_mono]
theorem prod_mono' [OrderedCommMonoid M] : Monotone fun f : ι → M ↦ ∏ i, f i := fun _ _ hfg ↦
- Finset.prod_le_prod'' fun x _ ↦ hfg x
+ Finset.prod_le_prod' fun x _ ↦ hfg x
#align fintype.prod_mono' Fintype.prod_mono'
#align fintype.sum_mono Fintype.sum_mono
WithTop
/WithBot
(#2406)
Some of these lemmas are generalized from ENNReal
while porting Data.Real.ENNReal
. Backported to Mathlib 3 in leanprover-community/mathlib#18487, now forward-porting back to Mathlib 4. Also forward-porting leanprover-community/mathlib#18391
order.with_bot
@995b47e555f1b6297c7cf16855f1023e355219fb
..afdb4fa3b32d41106a4a09b371ce549ad7958abd
algebra.order.monoid.with_top
@e7e2ba8aa216a5833b5ed85a93317263711a36b5
..afdb4fa3b32d41106a4a09b371ce549ad7958abd
algebra.order.sub.with_top
@10b4e499f43088dd3bb7b5796184ad5216648ab1
..afdb4fa3b32d41106a4a09b371ce549ad7958abd
algebra.order.ring.with_top
@e7e2ba8aa216a5833b5ed85a93317263711a36b5
..afdb4fa3b32d41106a4a09b371ce549ad7958abd
data.list.big_operators.basic
@47adfab39a11a072db552f47594bf8ed2cf8a722
..6c5f73fd6f6cc83122788a80a27cdd54663609f4
algebra.big_operators.order
@509de852e1de55e1efa8eacfa11df0823f26f226
..afdb4fa3b32d41106a4a09b371ce549ad7958abd
@@ -4,7 +4,7 @@ Released under Apache 2.0 license as described in the file LICENSE.
Authors: Johannes Hölzl
! This file was ported from Lean 3 source module algebra.big_operators.order
-! leanprover-community/mathlib commit 509de852e1de55e1efa8eacfa11df0823f26f226
+! leanprover-community/mathlib commit afdb4fa3b32d41106a4a09b371ce549ad7958abd
! Please do not edit these lines, except to modify the commit id
! if you have ported upstream changes.
-/
@@ -637,6 +637,12 @@ section CanonicallyOrderedCommSemiring
variable [CanonicallyOrderedCommSemiring R] {f g h : ι → R} {s : Finset ι} {i : ι}
+/-- Note that the name is to match `CanonicallyOrderedCommSemiring.mul_pos`. -/
+@[simp] lemma _root_.CanonicallyOrderedCommSemiring.prod_pos [Nontrivial R] :
+ 0 < ∏ i in s, f i ↔ (∀ i ∈ s, (0 : R) < f i) :=
+ CanonicallyOrderedCommSemiring.multiset_prod_pos.trans Multiset.forall_mem_map_iff
+#align canonically_ordered_comm_semiring.prod_pos CanonicallyOrderedCommSemiring.prod_pos
+
theorem prod_le_prod' (h : ∀ i ∈ s, f i ≤ g i) : (∏ i in s, f i) ≤ ∏ i in s, g i := by
classical
induction' s using Finset.induction with a s has ih h
@@ -696,36 +702,30 @@ namespace WithTop
open Finset
/-- A product of finite numbers is still finite -/
-theorem prod_lt_top [CanonicallyOrderedCommSemiring R] [Nontrivial R] [DecidableEq R] {s : Finset ι}
- {f : ι → WithTop R} (h : ∀ i ∈ s, f i ≠ ⊤) : (∏ i in s, f i) < ⊤ :=
- prod_induction f (fun a ↦ a < ⊤) (fun _ _ h₁ h₂ ↦ mul_lt_top h₁.ne h₂.ne) (coe_lt_top 1)
- fun a ha ↦ lt_top_iff_ne_top.2 (h a ha)
+theorem prod_lt_top [CommMonoidWithZero R] [NoZeroDivisors R] [Nontrivial R] [DecidableEq R] [LT R]
+ {s : Finset ι} {f : ι → WithTop R} (h : ∀ i ∈ s, f i ≠ ⊤) : (∏ i in s, f i) < ⊤ :=
+ prod_induction f (fun a ↦ a < ⊤) (fun _ _ h₁ h₂ ↦ mul_lt_top' h₁ h₂) (coe_lt_top 1)
+ fun a ha ↦ WithTop.lt_top_iff_ne_top.2 (h a ha)
#align with_top.prod_lt_top WithTop.prod_lt_top
-/-- A sum of finite numbers is still finite -/
-theorem sum_lt_top [OrderedAddCommMonoid M] {s : Finset ι} {f : ι → WithTop M}
- (h : ∀ i ∈ s, f i ≠ ⊤) : (∑ i in s, f i) < ⊤ :=
- sum_induction f (fun a ↦ a < ⊤) (fun _ _ h₁ h₂ ↦ add_lt_top.2 ⟨h₁, h₂⟩) zero_lt_top fun i hi ↦
- lt_top_iff_ne_top.2 (h i hi)
-#align with_top.sum_lt_top WithTop.sum_lt_top
-
/-- A sum of numbers is infinite iff one of them is infinite -/
-theorem sum_eq_top_iff [OrderedAddCommMonoid M] {s : Finset ι} {f : ι → WithTop M} :
+theorem sum_eq_top_iff [AddCommMonoid M] {s : Finset ι} {f : ι → WithTop M} :
(∑ i in s, f i) = ⊤ ↔ ∃ i ∈ s, f i = ⊤ := by
- classical
- constructor
- · contrapose!
- exact fun h ↦ (sum_lt_top fun i hi ↦ h i hi).ne
- · rintro ⟨i, his, hi⟩
- rw [sum_eq_add_sum_diff_singleton his, hi, top_add]
+ induction s using Finset.cons_induction <;> simp [*]
#align with_top.sum_eq_top_iff WithTop.sum_eq_top_iff
/-- A sum of finite numbers is still finite -/
-theorem sum_lt_top_iff [OrderedAddCommMonoid M] {s : Finset ι} {f : ι → WithTop M} :
+theorem sum_lt_top_iff [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M} :
(∑ i in s, f i) < ⊤ ↔ ∀ i ∈ s, f i < ⊤ := by
- simp only [lt_top_iff_ne_top, ne_eq, sum_eq_top_iff, not_exists, not_and]
+ simp only [WithTop.lt_top_iff_ne_top, ne_eq, sum_eq_top_iff, not_exists, not_and]
#align with_top.sum_lt_top_iff WithTop.sum_lt_top_iff
+/-- A sum of finite numbers is still finite -/
+theorem sum_lt_top [AddCommMonoid M] [LT M] {s : Finset ι} {f : ι → WithTop M}
+ (h : ∀ i ∈ s, f i ≠ ⊤) : (∑ i in s, f i) < ⊤ :=
+ sum_lt_top_iff.2 fun i hi => WithTop.lt_top_iff_ne_top.2 (h i hi)
+#align with_top.sum_lt_top WithTop.sum_lt_top
+
end WithTop
section AbsoluteValue
@@ -733,12 +733,8 @@ section AbsoluteValue
variable {S : Type _}
theorem AbsoluteValue.sum_le [Semiring R] [OrderedSemiring S] (abv : AbsoluteValue R S)
- (s : Finset ι) (f : ι → R) : abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) := by
- letI := Classical.decEq ι
- refine' Finset.induction_on s _ fun i s hi ih ↦ _
- · simp
- · simp only [Finset.sum_insert hi]
- exact (abv.add_le _ _).trans (add_le_add le_rfl ih)
+ (s : Finset ι) (f : ι → R) : abv (∑ i in s, f i) ≤ ∑ i in s, abv (f i) :=
+ Finset.le_sum_of_subadditive abv (map_zero _) abv.add_le _ _
#align absolute_value.sum_le AbsoluteValue.sum_le
theorem IsAbsoluteValue.abv_sum [Semiring R] [OrderedSemiring S] (abv : R → S) [IsAbsoluteValue abv]
@@ -22,8 +22,7 @@ Mostly monotonicity results for the `∏` and `∑` operations.
open Function
--- Porting note: commented out the next line
--- open BigOperators
+open BigOperators
variable {ι α β M N G k R : Type _}
The unported dependencies are