[GOAL]
R S : Type u
x y : R
inst✝ : Ring R
h : IsNilpotent x
⊢ IsNilpotent (-x)
[PROOFSTEP]
obtain ⟨n, hn⟩ := h
[GOAL]
case intro
R S : Type u
x y : R
inst✝ : Ring R
n : ℕ
hn : x ^ n = 0
⊢ IsNilpotent (-x)
[PROOFSTEP]
use n
[GOAL]
case h
R S : Type u
x y : R
inst✝ : Ring R
n : ℕ
hn : x ^ n = 0
⊢ (-x) ^ n = 0
[PROOFSTEP]
rw [neg_pow, hn, mul_zero]
[GOAL]
R S : Type u
x y : R
inst✝² : MonoidWithZero R
inst✝¹ : MonoidWithZero S
r : R
F : Type u_1
inst✝ : MonoidWithZeroHomClass F R S
hr : IsNilpotent r
f : F
⊢ IsNilpotent (↑f r)
[PROOFSTEP]
use hr.choose
[GOAL]
case h
R S : Type u
x y : R
inst✝² : MonoidWithZero R
inst✝¹ : MonoidWithZero S
r : R
F : Type u_1
inst✝ : MonoidWithZeroHomClass F R S
hr : IsNilpotent r
f : F
⊢ ↑f r ^ Exists.choose hr = 0
[PROOFSTEP]
rw [← map_pow, hr.choose_spec, map_zero]
[GOAL]
R S : Type u
x y : R
inst✝ : Ring R
r : R
hnil : IsNilpotent r
⊢ IsUnit (r - 1)
[PROOFSTEP]
obtain ⟨n, hn⟩ := hnil
[GOAL]
case intro
R S : Type u
x y : R
inst✝ : Ring R
r : R
n : ℕ
hn : r ^ n = 0
⊢ IsUnit (r - 1)
[PROOFSTEP]
refine' ⟨⟨r - 1, -∑ i in Finset.range n, r ^ i, _, _⟩, rfl⟩
[GOAL]
case intro.refine'_1
R S : Type u
x y : R
inst✝ : Ring R
r : R
n : ℕ
hn : r ^ n = 0
⊢ (r - 1) * -∑ i in Finset.range n, r ^ i = 1
[PROOFSTEP]
rw [mul_neg, mul_geom_sum, hn]
[GOAL]
case intro.refine'_1
R S : Type u
x y : R
inst✝ : Ring R
r : R
n : ℕ
hn : r ^ n = 0
⊢ -(0 - 1) = 1
[PROOFSTEP]
simp
[GOAL]
case intro.refine'_2
R S : Type u
x y : R
inst✝ : Ring R
r : R
n : ℕ
hn : r ^ n = 0
⊢ (-∑ i in Finset.range n, r ^ i) * (r - 1) = 1
[PROOFSTEP]
rw [neg_mul, geom_sum_mul, hn]
[GOAL]
case intro.refine'_2
R S : Type u
x y : R
inst✝ : Ring R
r : R
n : ℕ
hn : r ^ n = 0
⊢ -(0 - 1) = 1
[PROOFSTEP]
simp
[GOAL]
R S : Type u
x y : R
inst✝ : Ring R
r : R
u : Rˣ
hnil : IsNilpotent r
hru : Commute r ↑u⁻¹
⊢ IsUnit (↑u + r)
[PROOFSTEP]
rw [← Units.isUnit_mul_units _ u⁻¹, add_mul, Units.mul_inv, ← IsUnit.neg_iff, add_comm, neg_add, ← sub_eq_add_neg]
[GOAL]
R S : Type u
x y : R
inst✝ : Ring R
r : R
u : Rˣ
hnil : IsNilpotent r
hru : Commute r ↑u⁻¹
⊢ IsUnit (-(r * ↑u⁻¹) - 1)
[PROOFSTEP]
obtain ⟨n, hn⟩ := hnil
[GOAL]
case intro
R S : Type u
x y : R
inst✝ : Ring R
r : R
u : Rˣ
hru : Commute r ↑u⁻¹
n : ℕ
hn : r ^ n = 0
⊢ IsUnit (-(r * ↑u⁻¹) - 1)
[PROOFSTEP]
refine' IsNilpotent.sub_one_isUnit ⟨n, _⟩
[GOAL]
case intro
R S : Type u
x y : R
inst✝ : Ring R
r : R
u : Rˣ
hru : Commute r ↑u⁻¹
n : ℕ
hn : r ^ n = 0
⊢ (-(r * ↑u⁻¹)) ^ n = 0
[PROOFSTEP]
rw [neg_pow, hru.mul_pow, hn]
[GOAL]
case intro
R S : Type u
x y : R
inst✝ : Ring R
r : R
u : Rˣ
hru : Commute r ↑u⁻¹
n : ℕ
hn : r ^ n = 0
⊢ (-1) ^ n * (0 * ↑u⁻¹ ^ n) = 0
[PROOFSTEP]
simp
[GOAL]
R S : Type u
x y : R
inst✝³ : MonoidWithZero R
inst✝² : MonoidWithZero S
F : Type u_1
inst✝¹ : MonoidWithZeroHomClass F R S
f : F
hf : Function.Injective ↑f
inst✝ : IsReduced S
⊢ IsReduced R
[PROOFSTEP]
constructor
[GOAL]
case eq_zero
R S : Type u
x y : R
inst✝³ : MonoidWithZero R
inst✝² : MonoidWithZero S
F : Type u_1
inst✝¹ : MonoidWithZeroHomClass F R S
f : F
hf : Function.Injective ↑f
inst✝ : IsReduced S
⊢ ∀ (x : R), IsNilpotent x → x = 0
[PROOFSTEP]
intro x hx
[GOAL]
case eq_zero
R S : Type u
x✝ y : R
inst✝³ : MonoidWithZero R
inst✝² : MonoidWithZero S
F : Type u_1
inst✝¹ : MonoidWithZeroHomClass F R S
f : F
hf : Function.Injective ↑f
inst✝ : IsReduced S
x : R
hx : IsNilpotent x
⊢ x = 0
[PROOFSTEP]
apply hf
[GOAL]
case eq_zero.a
R S : Type u
x✝ y : R
inst✝³ : MonoidWithZero R
inst✝² : MonoidWithZero S
F : Type u_1
inst✝¹ : MonoidWithZeroHomClass F R S
f : F
hf : Function.Injective ↑f
inst✝ : IsReduced S
x : R
hx : IsNilpotent x
⊢ ↑f x = ↑f 0
[PROOFSTEP]
rw [map_zero]
[GOAL]
case eq_zero.a
R S : Type u
x✝ y : R
inst✝³ : MonoidWithZero R
inst✝² : MonoidWithZero S
F : Type u_1
inst✝¹ : MonoidWithZeroHomClass F R S
f : F
hf : Function.Injective ↑f
inst✝ : IsReduced S
x : R
hx : IsNilpotent x
⊢ ↑f x = 0
[PROOFSTEP]
exact (hx.map f).eq_zero
[GOAL]
R S✝ : Type u
x y : R
S : Type u_1
F : Type u_2
inst✝² : CommSemiring R
inst✝¹ : CommRing S
inst✝ : RingHomClass F R S
f : F
hf : Function.Surjective ↑f
⊢ Ideal.IsRadical (ker f) ↔ IsReduced S
[PROOFSTEP]
simp_rw [isReduced_iff, hf.forall, IsNilpotent, ← map_pow, ← RingHom.mem_ker]
[GOAL]
R S✝ : Type u
x y : R
S : Type u_1
F : Type u_2
inst✝² : CommSemiring R
inst✝¹ : CommRing S
inst✝ : RingHomClass F R S
f : F
hf : Function.Surjective ↑f
⊢ Ideal.IsRadical (ker f) ↔ ∀ (x : R), (∃ n, x ^ n ∈ ker f) → x ∈ ker f
[PROOFSTEP]
rfl
[GOAL]
R S : Type u
x y : R
inst✝ : MonoidWithZero R
⊢ IsRadical 0 ↔ IsReduced R
[PROOFSTEP]
simp_rw [isReduced_iff, IsNilpotent, exists_imp, ← zero_dvd_iff]
[GOAL]
R S : Type u
x y : R
inst✝ : MonoidWithZero R
⊢ IsRadical 0 ↔ ∀ (x : R) (x_1 : ℕ), 0 ∣ x ^ x_1 → 0 ∣ x
[PROOFSTEP]
exact forall_swap
[GOAL]
R S : Type u
x y : R
inst✝ : CommSemiring R
⊢ IsRadical y ↔ Ideal.IsRadical (Ideal.span {y})
[PROOFSTEP]
simp_rw [IsRadical, ← Ideal.mem_span_singleton]
[GOAL]
R S : Type u
x y : R
inst✝ : CommSemiring R
⊢ (∀ (n : ℕ) (x : R), x ^ n ∈ Ideal.span {y} → x ∈ Ideal.span {y}) ↔ Ideal.IsRadical (Ideal.span {y})
[PROOFSTEP]
exact forall_swap.trans (forall_congr' fun r => exists_imp.symm)
[GOAL]
R S : Type u
x y : R
inst✝ : MonoidWithZero R
k : ℕ
hk : 1 < k
⊢ IsReduced R ↔ ∀ (x : R), x ^ k = 0 → x = 0
[PROOFSTEP]
simp_rw [← zero_isRadical_iff, isRadical_iff_pow_one_lt k hk, zero_dvd_iff]
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
hx : IsNilpotent x
hy : IsNilpotent y
⊢ IsNilpotent (x + y)
[PROOFSTEP]
obtain ⟨n, hn⟩ := hx
[GOAL]
case intro
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
hy : IsNilpotent y
n : ℕ
hn : x ^ n = 0
⊢ IsNilpotent (x + y)
[PROOFSTEP]
obtain ⟨m, hm⟩ := hy
[GOAL]
case intro.intro
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
n : ℕ
hn : x ^ n = 0
m : ℕ
hm : y ^ m = 0
⊢ IsNilpotent (x + y)
[PROOFSTEP]
use n + m - 1
[GOAL]
case h
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
n : ℕ
hn : x ^ n = 0
m : ℕ
hm : y ^ m = 0
⊢ (x + y) ^ (n + m - 1) = 0
[PROOFSTEP]
rw [h_comm.add_pow']
[GOAL]
case h
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
n : ℕ
hn : x ^ n = 0
m : ℕ
hm : y ^ m = 0
⊢ ∑ m_1 in Finset.Nat.antidiagonal (n + m - 1), Nat.choose (n + m - 1) m_1.fst • (x ^ m_1.fst * y ^ m_1.snd) = 0
[PROOFSTEP]
apply Finset.sum_eq_zero
[GOAL]
case h.h
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
n : ℕ
hn : x ^ n = 0
m : ℕ
hm : y ^ m = 0
⊢ ∀ (x_1 : ℕ × ℕ),
    x_1 ∈ Finset.Nat.antidiagonal (n + m - 1) → Nat.choose (n + m - 1) x_1.fst • (x ^ x_1.fst * y ^ x_1.snd) = 0
[PROOFSTEP]
rintro ⟨i, j⟩ hij
[GOAL]
case h.h.mk
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
n : ℕ
hn : x ^ n = 0
m : ℕ
hm : y ^ m = 0
i j : ℕ
hij : (i, j) ∈ Finset.Nat.antidiagonal (n + m - 1)
⊢ Nat.choose (n + m - 1) (i, j).fst • (x ^ (i, j).fst * y ^ (i, j).snd) = 0
[PROOFSTEP]
suffices x ^ i * y ^ j = 0 by simp only [this, nsmul_eq_mul, mul_zero]
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
n : ℕ
hn : x ^ n = 0
m : ℕ
hm : y ^ m = 0
i j : ℕ
hij : (i, j) ∈ Finset.Nat.antidiagonal (n + m - 1)
this : x ^ i * y ^ j = 0
⊢ Nat.choose (n + m - 1) (i, j).fst • (x ^ (i, j).fst * y ^ (i, j).snd) = 0
[PROOFSTEP]
simp only [this, nsmul_eq_mul, mul_zero]
[GOAL]
case h.h.mk
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
n : ℕ
hn : x ^ n = 0
m : ℕ
hm : y ^ m = 0
i j : ℕ
hij : (i, j) ∈ Finset.Nat.antidiagonal (n + m - 1)
⊢ x ^ i * y ^ j = 0
[PROOFSTEP]
cases' Nat.le_or_le_of_add_eq_add_pred (Finset.Nat.mem_antidiagonal.mp hij) with hi hj
[GOAL]
case h.h.mk.inl
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
n : ℕ
hn : x ^ n = 0
m : ℕ
hm : y ^ m = 0
i j : ℕ
hij : (i, j) ∈ Finset.Nat.antidiagonal (n + m - 1)
hi : n ≤ (i, j).fst
⊢ x ^ i * y ^ j = 0
[PROOFSTEP]
rw [pow_eq_zero_of_le hi hn, zero_mul]
[GOAL]
case h.h.mk.inr
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
n : ℕ
hn : x ^ n = 0
m : ℕ
hm : y ^ m = 0
i j : ℕ
hij : (i, j) ∈ Finset.Nat.antidiagonal (n + m - 1)
hj : m ≤ (i, j).snd
⊢ x ^ i * y ^ j = 0
[PROOFSTEP]
rw [pow_eq_zero_of_le hj hm, mul_zero]
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝ : Commute x y
ι : Type u_1
s : Finset ι
f : ι → R
hnp : ∀ (i : ι), i ∈ s → IsNilpotent (f i)
h_comm : ∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)
⊢ IsNilpotent (∑ i in s, f i)
[PROOFSTEP]
classical
induction' s using Finset.induction with j s hj ih; simp
rw [Finset.sum_insert hj]
apply Commute.isNilpotent_add
· exact Commute.sum_right _ _ _ (fun i hi ↦ h_comm _ _ (by simp) (by simp [hi]))
· apply hnp; simp
· exact ih (fun i hi ↦ hnp i (by simp [hi])) (fun i j hi hj ↦ h_comm i j (by simp [hi]) (by simp [hj]))
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝ : Commute x y
ι : Type u_1
s : Finset ι
f : ι → R
hnp : ∀ (i : ι), i ∈ s → IsNilpotent (f i)
h_comm : ∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)
⊢ IsNilpotent (∑ i in s, f i)
[PROOFSTEP]
induction' s using Finset.induction with j s hj ih
[GOAL]
case empty
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)
hnp : ∀ (i : ι), i ∈ ∅ → IsNilpotent (f i)
h_comm : ∀ (i j : ι), i ∈ ∅ → j ∈ ∅ → Commute (f i) (f j)
⊢ IsNilpotent (∑ i in ∅, f i)
case insert
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s✝ : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s✝ → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s✝ → j ∈ s✝ → Commute (f i) (f j)
j : ι
s : Finset ι
hj : ¬j ∈ s
ih :
  (∀ (i : ι), i ∈ s → IsNilpotent (f i)) →
    (∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)) → IsNilpotent (∑ i in s, f i)
hnp : ∀ (i : ι), i ∈ insert j s → IsNilpotent (f i)
h_comm : ∀ (i j_1 : ι), i ∈ insert j s → j_1 ∈ insert j s → Commute (f i) (f j_1)
⊢ IsNilpotent (∑ i in insert j s, f i)
[PROOFSTEP]
simp
[GOAL]
case insert
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s✝ : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s✝ → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s✝ → j ∈ s✝ → Commute (f i) (f j)
j : ι
s : Finset ι
hj : ¬j ∈ s
ih :
  (∀ (i : ι), i ∈ s → IsNilpotent (f i)) →
    (∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)) → IsNilpotent (∑ i in s, f i)
hnp : ∀ (i : ι), i ∈ insert j s → IsNilpotent (f i)
h_comm : ∀ (i j_1 : ι), i ∈ insert j s → j_1 ∈ insert j s → Commute (f i) (f j_1)
⊢ IsNilpotent (∑ i in insert j s, f i)
[PROOFSTEP]
rw [Finset.sum_insert hj]
[GOAL]
case insert
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s✝ : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s✝ → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s✝ → j ∈ s✝ → Commute (f i) (f j)
j : ι
s : Finset ι
hj : ¬j ∈ s
ih :
  (∀ (i : ι), i ∈ s → IsNilpotent (f i)) →
    (∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)) → IsNilpotent (∑ i in s, f i)
hnp : ∀ (i : ι), i ∈ insert j s → IsNilpotent (f i)
h_comm : ∀ (i j_1 : ι), i ∈ insert j s → j_1 ∈ insert j s → Commute (f i) (f j_1)
⊢ IsNilpotent (f j + ∑ x in s, f x)
[PROOFSTEP]
apply Commute.isNilpotent_add
[GOAL]
case insert.h_comm
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s✝ : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s✝ → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s✝ → j ∈ s✝ → Commute (f i) (f j)
j : ι
s : Finset ι
hj : ¬j ∈ s
ih :
  (∀ (i : ι), i ∈ s → IsNilpotent (f i)) →
    (∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)) → IsNilpotent (∑ i in s, f i)
hnp : ∀ (i : ι), i ∈ insert j s → IsNilpotent (f i)
h_comm : ∀ (i j_1 : ι), i ∈ insert j s → j_1 ∈ insert j s → Commute (f i) (f j_1)
⊢ Commute (f j) (∑ x in s, f x)
[PROOFSTEP]
exact Commute.sum_right _ _ _ (fun i hi ↦ h_comm _ _ (by simp) (by simp [hi]))
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s✝ : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s✝ → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s✝ → j ∈ s✝ → Commute (f i) (f j)
j : ι
s : Finset ι
hj : ¬j ∈ s
ih :
  (∀ (i : ι), i ∈ s → IsNilpotent (f i)) →
    (∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)) → IsNilpotent (∑ i in s, f i)
hnp : ∀ (i : ι), i ∈ insert j s → IsNilpotent (f i)
h_comm : ∀ (i j_1 : ι), i ∈ insert j s → j_1 ∈ insert j s → Commute (f i) (f j_1)
i : ι
hi : i ∈ s
⊢ j ∈ insert j s
[PROOFSTEP]
simp
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s✝ : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s✝ → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s✝ → j ∈ s✝ → Commute (f i) (f j)
j : ι
s : Finset ι
hj : ¬j ∈ s
ih :
  (∀ (i : ι), i ∈ s → IsNilpotent (f i)) →
    (∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)) → IsNilpotent (∑ i in s, f i)
hnp : ∀ (i : ι), i ∈ insert j s → IsNilpotent (f i)
h_comm : ∀ (i j_1 : ι), i ∈ insert j s → j_1 ∈ insert j s → Commute (f i) (f j_1)
i : ι
hi : i ∈ s
⊢ i ∈ insert j s
[PROOFSTEP]
simp [hi]
[GOAL]
case insert.hx
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s✝ : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s✝ → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s✝ → j ∈ s✝ → Commute (f i) (f j)
j : ι
s : Finset ι
hj : ¬j ∈ s
ih :
  (∀ (i : ι), i ∈ s → IsNilpotent (f i)) →
    (∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)) → IsNilpotent (∑ i in s, f i)
hnp : ∀ (i : ι), i ∈ insert j s → IsNilpotent (f i)
h_comm : ∀ (i j_1 : ι), i ∈ insert j s → j_1 ∈ insert j s → Commute (f i) (f j_1)
⊢ IsNilpotent (f j)
[PROOFSTEP]
apply hnp
[GOAL]
case insert.hx.a
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s✝ : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s✝ → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s✝ → j ∈ s✝ → Commute (f i) (f j)
j : ι
s : Finset ι
hj : ¬j ∈ s
ih :
  (∀ (i : ι), i ∈ s → IsNilpotent (f i)) →
    (∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)) → IsNilpotent (∑ i in s, f i)
hnp : ∀ (i : ι), i ∈ insert j s → IsNilpotent (f i)
h_comm : ∀ (i j_1 : ι), i ∈ insert j s → j_1 ∈ insert j s → Commute (f i) (f j_1)
⊢ j ∈ insert j s
[PROOFSTEP]
simp
[GOAL]
case insert.hy
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s✝ : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s✝ → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s✝ → j ∈ s✝ → Commute (f i) (f j)
j : ι
s : Finset ι
hj : ¬j ∈ s
ih :
  (∀ (i : ι), i ∈ s → IsNilpotent (f i)) →
    (∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)) → IsNilpotent (∑ i in s, f i)
hnp : ∀ (i : ι), i ∈ insert j s → IsNilpotent (f i)
h_comm : ∀ (i j_1 : ι), i ∈ insert j s → j_1 ∈ insert j s → Commute (f i) (f j_1)
⊢ IsNilpotent (∑ x in s, f x)
[PROOFSTEP]
exact ih (fun i hi ↦ hnp i (by simp [hi])) (fun i j hi hj ↦ h_comm i j (by simp [hi]) (by simp [hj]))
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s✝ : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s✝ → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s✝ → j ∈ s✝ → Commute (f i) (f j)
j : ι
s : Finset ι
hj : ¬j ∈ s
ih :
  (∀ (i : ι), i ∈ s → IsNilpotent (f i)) →
    (∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)) → IsNilpotent (∑ i in s, f i)
hnp : ∀ (i : ι), i ∈ insert j s → IsNilpotent (f i)
h_comm : ∀ (i j_1 : ι), i ∈ insert j s → j_1 ∈ insert j s → Commute (f i) (f j_1)
i : ι
hi : i ∈ s
⊢ i ∈ insert j s
[PROOFSTEP]
simp [hi]
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s✝ : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s✝ → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s✝ → j ∈ s✝ → Commute (f i) (f j)
j✝ : ι
s : Finset ι
hj✝ : ¬j✝ ∈ s
ih :
  (∀ (i : ι), i ∈ s → IsNilpotent (f i)) →
    (∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)) → IsNilpotent (∑ i in s, f i)
hnp : ∀ (i : ι), i ∈ insert j✝ s → IsNilpotent (f i)
h_comm : ∀ (i j : ι), i ∈ insert j✝ s → j ∈ insert j✝ s → Commute (f i) (f j)
i j : ι
hi : i ∈ s
hj : j ∈ s
⊢ i ∈ insert j✝ s
[PROOFSTEP]
simp [hi]
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm✝¹ : Commute x y
ι : Type u_1
s✝ : Finset ι
f : ι → R
hnp✝ : ∀ (i : ι), i ∈ s✝ → IsNilpotent (f i)
h_comm✝ : ∀ (i j : ι), i ∈ s✝ → j ∈ s✝ → Commute (f i) (f j)
j✝ : ι
s : Finset ι
hj✝ : ¬j✝ ∈ s
ih :
  (∀ (i : ι), i ∈ s → IsNilpotent (f i)) →
    (∀ (i j : ι), i ∈ s → j ∈ s → Commute (f i) (f j)) → IsNilpotent (∑ i in s, f i)
hnp : ∀ (i : ι), i ∈ insert j✝ s → IsNilpotent (f i)
h_comm : ∀ (i j : ι), i ∈ insert j✝ s → j ∈ insert j✝ s → Commute (f i) (f j)
i j : ι
hi : i ∈ s
hj : j ∈ s
⊢ j ∈ insert j✝ s
[PROOFSTEP]
simp [hj]
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
h : IsNilpotent x
⊢ IsNilpotent (x * y)
[PROOFSTEP]
obtain ⟨n, hn⟩ := h
[GOAL]
case intro
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
n : ℕ
hn : x ^ n = 0
⊢ IsNilpotent (x * y)
[PROOFSTEP]
use n
[GOAL]
case h
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
n : ℕ
hn : x ^ n = 0
⊢ (x * y) ^ n = 0
[PROOFSTEP]
rw [h_comm.mul_pow, hn, zero_mul]
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
hy : y ∈ nonZeroDivisorsLeft R
⊢ IsNilpotent (x * y) ↔ IsNilpotent x
[PROOFSTEP]
refine' ⟨_, h_comm.isNilpotent_mul_left⟩
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
hy : y ∈ nonZeroDivisorsLeft R
⊢ IsNilpotent (x * y) → IsNilpotent x
[PROOFSTEP]
rintro ⟨k, hk⟩
[GOAL]
case intro
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
hy : y ∈ nonZeroDivisorsLeft R
k : ℕ
hk : (x * y) ^ k = 0
⊢ IsNilpotent x
[PROOFSTEP]
rw [mul_pow h_comm] at hk
[GOAL]
case intro
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
hy : y ∈ nonZeroDivisorsLeft R
k : ℕ
hk : x ^ k * y ^ k = 0
⊢ IsNilpotent x
[PROOFSTEP]
exact ⟨k, (nonZeroDivisorsLeft R).pow_mem hy k _ hk⟩
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
h : IsNilpotent y
⊢ IsNilpotent (x * y)
[PROOFSTEP]
rw [h_comm.eq]
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
h : IsNilpotent y
⊢ IsNilpotent (y * x)
[PROOFSTEP]
exact h_comm.symm.isNilpotent_mul_left h
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
hx : x ∈ nonZeroDivisorsRight R
⊢ IsNilpotent (x * y) ↔ IsNilpotent y
[PROOFSTEP]
refine' ⟨_, h_comm.isNilpotent_mul_right⟩
[GOAL]
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
hx : x ∈ nonZeroDivisorsRight R
⊢ IsNilpotent (x * y) → IsNilpotent y
[PROOFSTEP]
rintro ⟨k, hk⟩
[GOAL]
case intro
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
hx : x ∈ nonZeroDivisorsRight R
k : ℕ
hk : (x * y) ^ k = 0
⊢ IsNilpotent y
[PROOFSTEP]
rw [mul_pow h_comm] at hk
[GOAL]
case intro
R S : Type u
x y : R
inst✝ : Semiring R
h_comm : Commute x y
hx : x ∈ nonZeroDivisorsRight R
k : ℕ
hk : x ^ k * y ^ k = 0
⊢ IsNilpotent y
[PROOFSTEP]
exact ⟨k, (nonZeroDivisorsRight R).pow_mem hx k _ hk⟩
[GOAL]
R S : Type u
x y : R
inst✝ : Ring R
h_comm : Commute x y
hx : IsNilpotent x
hy : IsNilpotent y
⊢ IsNilpotent (x - y)
[PROOFSTEP]
rw [← neg_right_iff] at h_comm
[GOAL]
R S : Type u
x y : R
inst✝ : Ring R
h_comm✝ : Commute x y
h_comm : Commute x (-y)
hx : IsNilpotent x
hy : IsNilpotent y
⊢ IsNilpotent (x - y)
[PROOFSTEP]
rw [← isNilpotent_neg_iff] at hy
[GOAL]
R S : Type u
x y : R
inst✝ : Ring R
h_comm✝ : Commute x y
h_comm : Commute x (-y)
hx : IsNilpotent x
hy : IsNilpotent (-y)
⊢ IsNilpotent (x - y)
[PROOFSTEP]
rw [sub_eq_add_neg]
[GOAL]
R S : Type u
x y : R
inst✝ : Ring R
h_comm✝ : Commute x y
h_comm : Commute x (-y)
hx : IsNilpotent x
hy : IsNilpotent (-y)
⊢ IsNilpotent (x + -y)
[PROOFSTEP]
exact h_comm.isNilpotent_add hx hy
[GOAL]
R✝ S : Type u
x✝ y✝ : R✝
inst✝¹ : CommSemiring R✝
x y : R✝
R : Type u_1
inst✝ : CommSemiring R
⊢ sInf {J | ⊥ ≤ J ∧ Ideal.IsPrime J} = sInf {J | Ideal.IsPrime J}
[PROOFSTEP]
simp_rw [and_iff_right bot_le]
[GOAL]
R S : Type u
x✝ y✝ : R
inst✝ : CommSemiring R
x y : R
⊢ IsNilpotent x ↔ ∀ (J : Ideal R), Ideal.IsPrime J → x ∈ J
[PROOFSTEP]
rw [← mem_nilradical, nilradical_eq_sInf, Submodule.mem_sInf]
[GOAL]
R S : Type u
x✝ y✝ : R
inst✝ : CommSemiring R
x y : R
⊢ (∀ (p : Submodule R R), p ∈ {J | Ideal.IsPrime J} → x ∈ p) ↔ ∀ (J : Ideal R), Ideal.IsPrime J → x ∈ J
[PROOFSTEP]
rfl
[GOAL]
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
⊢ IsNilpotent (mulLeft R a) ↔ IsNilpotent a
[PROOFSTEP]
constructor
[GOAL]
case mp
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
⊢ IsNilpotent (mulLeft R a) → IsNilpotent a
[PROOFSTEP]
rintro ⟨n, hn⟩
[GOAL]
case mpr
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
⊢ IsNilpotent a → IsNilpotent (mulLeft R a)
[PROOFSTEP]
rintro ⟨n, hn⟩
[GOAL]
case mp.intro
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
n : ℕ
hn : mulLeft R a ^ n = 0
⊢ IsNilpotent a
[PROOFSTEP]
use n
[GOAL]
case mpr.intro
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
n : ℕ
hn : a ^ n = 0
⊢ IsNilpotent (mulLeft R a)
[PROOFSTEP]
use n
[GOAL]
case h
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
n : ℕ
hn : mulLeft R a ^ n = 0
⊢ a ^ n = 0
[PROOFSTEP]
simp only [mulLeft_eq_zero_iff, pow_mulLeft] at hn ⊢
[GOAL]
case h
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
n : ℕ
hn : a ^ n = 0
⊢ mulLeft R a ^ n = 0
[PROOFSTEP]
simp only [mulLeft_eq_zero_iff, pow_mulLeft] at hn ⊢
[GOAL]
case h
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
n : ℕ
hn : a ^ n = 0
⊢ a ^ n = 0
[PROOFSTEP]
exact hn
[GOAL]
case h
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
n : ℕ
hn : a ^ n = 0
⊢ a ^ n = 0
[PROOFSTEP]
exact hn
[GOAL]
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
⊢ IsNilpotent (mulRight R a) ↔ IsNilpotent a
[PROOFSTEP]
constructor
[GOAL]
case mp
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
⊢ IsNilpotent (mulRight R a) → IsNilpotent a
[PROOFSTEP]
rintro ⟨n, hn⟩
[GOAL]
case mpr
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
⊢ IsNilpotent a → IsNilpotent (mulRight R a)
[PROOFSTEP]
rintro ⟨n, hn⟩
[GOAL]
case mp.intro
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
n : ℕ
hn : mulRight R a ^ n = 0
⊢ IsNilpotent a
[PROOFSTEP]
use n
[GOAL]
case mpr.intro
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
n : ℕ
hn : a ^ n = 0
⊢ IsNilpotent (mulRight R a)
[PROOFSTEP]
use n
[GOAL]
case h
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
n : ℕ
hn : mulRight R a ^ n = 0
⊢ a ^ n = 0
[PROOFSTEP]
simp only [mulRight_eq_zero_iff, pow_mulRight] at hn ⊢
[GOAL]
case h
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
n : ℕ
hn : a ^ n = 0
⊢ mulRight R a ^ n = 0
[PROOFSTEP]
simp only [mulRight_eq_zero_iff, pow_mulRight] at hn ⊢
[GOAL]
case h
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
n : ℕ
hn : a ^ n = 0
⊢ a ^ n = 0
[PROOFSTEP]
exact hn
[GOAL]
case h
R S : Type u
x y : R
A : Type v
inst✝² : CommSemiring R
inst✝¹ : Semiring A
inst✝ : Algebra R A
a : A
n : ℕ
hn : a ^ n = 0
⊢ a ^ n = 0
[PROOFSTEP]
exact hn
[GOAL]
R S : Type u
x y : R
M : Type v
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : End R M
p : Submodule R M
hp : p ≤ Submodule.comap f p
hnp : IsNilpotent f
⊢ IsNilpotent (Submodule.mapQ p p f hp)
[PROOFSTEP]
obtain ⟨k, hk⟩ := hnp
[GOAL]
case intro
R S : Type u
x y : R
M : Type v
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : End R M
p : Submodule R M
hp : p ≤ Submodule.comap f p
k : ℕ
hk : f ^ k = 0
⊢ IsNilpotent (Submodule.mapQ p p f hp)
[PROOFSTEP]
use k
[GOAL]
case h
R S : Type u
x y : R
M : Type v
inst✝² : Ring R
inst✝¹ : AddCommGroup M
inst✝ : Module R M
f : End R M
p : Submodule R M
hp : p ≤ Submodule.comap f p
k : ℕ
hk : f ^ k = 0
⊢ Submodule.mapQ p p f hp ^ k = 0
[PROOFSTEP]
simp [← p.mapQ_pow, hk]


[GOAL]
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
⊢ Exact f g ↔ AddMonoidHom.range f = AddMonoidHom.ker g
[PROOFSTEP]
rw [Abelian.exact_iff' f g (kernelIsLimit _) (cokernelIsColimit _)]
[GOAL]
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
⊢ f ≫ g = 0 ∧ Fork.ι (kernelCone g) ≫ Cofork.π (cokernelCocone f) = 0 ↔ AddMonoidHom.range f = AddMonoidHom.ker g
[PROOFSTEP]
exact
  ⟨fun h =>
    ((AddMonoidHom.range_le_ker_iff _ _).mpr h.left).antisymm ((QuotientAddGroup.ker_le_range_iff _ _).mpr h.right),
    fun h => ⟨(AddMonoidHom.range_le_ker_iff _ _).mp h.le, (QuotientAddGroup.ker_le_range_iff _ _).mp h.symm.le⟩⟩
[GOAL]
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
⊢ PreservesFiniteLimits colim
[PROOFSTEP]
refine Functor.preservesFiniteLimitsOfMapExact _ fun F G H η γ h => (exact_iff _ _).mpr (le_antisymm ?_ ?_)
[GOAL]
case refine_1
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : Exact η γ
⊢ AddMonoidHom.range (colim.map η) ≤ AddMonoidHom.ker (colim.map γ)
case refine_2
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : Exact η γ
⊢ AddMonoidHom.ker (colim.map γ) ≤ AddMonoidHom.range (colim.map η)
[PROOFSTEP]
all_goals replace h : ∀ j : J, Exact (η.app j) (γ.app j) := fun j => Functor.map_exact ((evaluation _ _).obj j) η γ h
[GOAL]
case refine_1
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : Exact η γ
⊢ AddMonoidHom.range (colim.map η) ≤ AddMonoidHom.ker (colim.map γ)
[PROOFSTEP]
replace h : ∀ j : J, Exact (η.app j) (γ.app j) := fun j => Functor.map_exact ((evaluation _ _).obj j) η γ h
[GOAL]
case refine_2
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : Exact η γ
⊢ AddMonoidHom.ker (colim.map γ) ≤ AddMonoidHom.range (colim.map η)
[PROOFSTEP]
replace h : ∀ j : J, Exact (η.app j) (γ.app j) := fun j => Functor.map_exact ((evaluation _ _).obj j) η γ h
[GOAL]
case refine_1
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
⊢ AddMonoidHom.range (colim.map η) ≤ AddMonoidHom.ker (colim.map γ)
[PROOFSTEP]
rw [AddMonoidHom.range_le_ker_iff, ← comp_def]
[GOAL]
case refine_1
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
⊢ colim.map η ≫ colim.map γ = 0
[PROOFSTEP]
exact colimit.hom_ext fun j => by simp [reassoc_of% (h j).w]
[GOAL]
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
j : J
⊢ colimit.ι F j ≫ colim.map η ≫ colim.map γ = colimit.ι F j ≫ 0
[PROOFSTEP]
simp [reassoc_of% (h j).w]
[GOAL]
case refine_2
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
⊢ AddMonoidHom.ker (colim.map γ) ≤ AddMonoidHom.range (colim.map η)
[PROOFSTEP]
intro x (hx : _ = _)
[GOAL]
case refine_2
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
x : ↑(colim.obj G)
hx : ↑(colim.map γ) x = 0
⊢ x ∈ AddMonoidHom.range (colim.map η)
[PROOFSTEP]
rcases Concrete.colimit_exists_rep G x with ⟨j, y, rfl⟩
[GOAL]
case refine_2.intro.intro
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
j : J
y : (forget AddCommGroupCat).obj (G.obj j)
hx : ↑(colim.map γ) (↑(colimit.ι G j) y) = 0
⊢ ↑(colimit.ι G j) y ∈ AddMonoidHom.range (colim.map η)
[PROOFSTEP]
erw [← comp_apply, colimit.ι_map, comp_apply, ← map_zero (by exact colimit.ι H j : H.obj j →+ ↑(colimit H))] at hx
[GOAL]
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
j : J
y : (forget AddCommGroupCat).obj (G.obj j)
hx : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = 0
⊢ ↑(H.obj j) →+ ↑(colimit H)
[PROOFSTEP]
exact colimit.ι H j
[GOAL]
case refine_2.intro.intro
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
j : J
y : (forget AddCommGroupCat).obj (G.obj j)
hx✝ : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = 0
hx : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = ↑(colimit.ι H j) 0
⊢ ↑(colimit.ι G j) y ∈ AddMonoidHom.range (colim.map η)
[PROOFSTEP]
rcases Concrete.colimit_exists_of_rep_eq H _ _ hx with ⟨k, e₁, e₂, hk : _ = H.map e₂ 0⟩
[GOAL]
case refine_2.intro.intro.intro.intro.intro
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
j : J
y : (forget AddCommGroupCat).obj (G.obj j)
hx✝ : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = 0
hx : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = ↑(colimit.ι H j) 0
k : J
e₁ e₂ : j ⟶ k
hk : ↑(H.map e₁) (↑(NatTrans.app γ j) y) = ↑(H.map e₂) 0
⊢ ↑(colimit.ι G j) y ∈ AddMonoidHom.range (colim.map η)
[PROOFSTEP]
rw [map_zero, ← comp_apply, ← NatTrans.naturality, comp_apply] at hk
[GOAL]
case refine_2.intro.intro.intro.intro.intro
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
j : J
y : (forget AddCommGroupCat).obj (G.obj j)
hx✝ : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = 0
hx : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = ↑(colimit.ι H j) 0
k : J
e₁ e₂ : j ⟶ k
hk : ↑(NatTrans.app γ k) (↑(G.map e₁) y) = 0
⊢ ↑(colimit.ι G j) y ∈ AddMonoidHom.range (colim.map η)
[PROOFSTEP]
rcases((exact_iff _ _).mp <| h k).ge hk with ⟨t, ht⟩
[GOAL]
case refine_2.intro.intro.intro.intro.intro.intro
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
j : J
y : (forget AddCommGroupCat).obj (G.obj j)
hx✝ : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = 0
hx : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = ↑(colimit.ι H j) 0
k : J
e₁ e₂ : j ⟶ k
hk : ↑(NatTrans.app γ k) (↑(G.map e₁) y) = 0
t : ↑(F.obj k)
ht : ↑(NatTrans.app η k) t = ↑(G.map e₁) y
⊢ ↑(colimit.ι G j) y ∈ AddMonoidHom.range (colim.map η)
[PROOFSTEP]
use colimit.ι F k t
[GOAL]
case h
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
j : J
y : (forget AddCommGroupCat).obj (G.obj j)
hx✝ : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = 0
hx : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = ↑(colimit.ι H j) 0
k : J
e₁ e₂ : j ⟶ k
hk : ↑(NatTrans.app γ k) (↑(G.map e₁) y) = 0
t : ↑(F.obj k)
ht : ↑(NatTrans.app η k) t = ↑(G.map e₁) y
⊢ ↑(colim.map η) (↑(colimit.ι F k) t) = ↑(colimit.ι G j) y
[PROOFSTEP]
erw [← comp_apply, colimit.ι_map, comp_apply, ht]
[GOAL]
case h
X Y Z : AddCommGroupCat
f : X ⟶ Y
g : Y ⟶ Z
J : Type u
inst✝¹ : SmallCategory J
inst✝ : IsFiltered J
F G H : J ⥤ AddCommGroupCat
η : F ⟶ G
γ : G ⟶ H
h : ∀ (j : J), Exact (NatTrans.app η j) (NatTrans.app γ j)
j : J
y : (forget AddCommGroupCat).obj (G.obj j)
hx✝ : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = 0
hx : ↑(colimit.ι H j) (↑(NatTrans.app γ j) y) = ↑(colimit.ι H j) 0
k : J
e₁ e₂ : j ⟶ k
hk : ↑(NatTrans.app γ k) (↑(G.map e₁) y) = 0
t : ↑(F.obj k)
ht : ↑(NatTrans.app η k) t = ↑(G.map e₁) y
⊢ ↑(colimit.ι G k) (↑(G.map e₁) y) = ↑(colimit.ι G j) y
[PROOFSTEP]
exact colimit.w_apply G e₁ y


[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f : M → N
p : M → Prop
h_mul : ∀ (x y : M), p x → p y → f (x * y) ≤ f x * f y
hp_mul : ∀ (x y : M), p x → p y → p (x * y)
g : ι → M
s : Finset ι
hs_nonempty : Finset.Nonempty s
hs : ∀ (i : ι), i ∈ s → p (g i)
⊢ f (∏ i in s, g i) ≤ ∏ i in s, f (g i)
[PROOFSTEP]
refine' le_trans (Multiset.le_prod_nonempty_of_submultiplicative_on_pred f p h_mul hp_mul _ _ _) _
[GOAL]
case refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f : M → N
p : M → Prop
h_mul : ∀ (x y : M), p x → p y → f (x * y) ≤ f x * f y
hp_mul : ∀ (x y : M), p x → p y → p (x * y)
g : ι → M
s : Finset ι
hs_nonempty : Finset.Nonempty s
hs : ∀ (i : ι), i ∈ s → p (g i)
⊢ Multiset.map (fun i => g i) s.val ≠ ∅
[PROOFSTEP]
simp [hs_nonempty.ne_empty]
[GOAL]
case refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f : M → N
p : M → Prop
h_mul : ∀ (x y : M), p x → p y → f (x * y) ≤ f x * f y
hp_mul : ∀ (x y : M), p x → p y → p (x * y)
g : ι → M
s : Finset ι
hs_nonempty : Finset.Nonempty s
hs : ∀ (i : ι), i ∈ s → p (g i)
⊢ ∀ (a : M), a ∈ Multiset.map (fun i => g i) s.val → p a
[PROOFSTEP]
exact Multiset.forall_mem_map_iff.mpr hs
[GOAL]
case refine'_3
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f : M → N
p : M → Prop
h_mul : ∀ (x y : M), p x → p y → f (x * y) ≤ f x * f y
hp_mul : ∀ (x y : M), p x → p y → p (x * y)
g : ι → M
s : Finset ι
hs_nonempty : Finset.Nonempty s
hs : ∀ (i : ι), i ∈ s → p (g i)
⊢ Multiset.prod (Multiset.map f (Multiset.map (fun i => g i) s.val)) ≤ ∏ i in s, f (g i)
[PROOFSTEP]
rw [Multiset.map_map]
[GOAL]
case refine'_3
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f : M → N
p : M → Prop
h_mul : ∀ (x y : M), p x → p y → f (x * y) ≤ f x * f y
hp_mul : ∀ (x y : M), p x → p y → p (x * y)
g : ι → M
s : Finset ι
hs_nonempty : Finset.Nonempty s
hs : ∀ (i : ι), i ∈ s → p (g i)
⊢ Multiset.prod (Multiset.map (f ∘ fun i => g i) s.val) ≤ ∏ i in s, f (g i)
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f : M → N
p : M → Prop
h_one : f 1 = 1
h_mul : ∀ (x y : M), p x → p y → f (x * y) ≤ f x * f y
hp_mul : ∀ (x y : M), p x → p y → p (x * y)
g : ι → M
s : Finset ι
hs : ∀ (i : ι), i ∈ s → p (g i)
⊢ f (∏ i in s, g i) ≤ ∏ i in s, f (g i)
[PROOFSTEP]
rcases eq_empty_or_nonempty s with (rfl | hs_nonempty)
[GOAL]
case inl
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f : M → N
p : M → Prop
h_one : f 1 = 1
h_mul : ∀ (x y : M), p x → p y → f (x * y) ≤ f x * f y
hp_mul : ∀ (x y : M), p x → p y → p (x * y)
g : ι → M
hs : ∀ (i : ι), i ∈ ∅ → p (g i)
⊢ f (∏ i in ∅, g i) ≤ ∏ i in ∅, f (g i)
[PROOFSTEP]
simp [h_one]
[GOAL]
case inr
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f : M → N
p : M → Prop
h_one : f 1 = 1
h_mul : ∀ (x y : M), p x → p y → f (x * y) ≤ f x * f y
hp_mul : ∀ (x y : M), p x → p y → p (x * y)
g : ι → M
s : Finset ι
hs : ∀ (i : ι), i ∈ s → p (g i)
hs_nonempty : Finset.Nonempty s
⊢ f (∏ i in s, g i) ≤ ∏ i in s, f (g i)
[PROOFSTEP]
exact le_prod_nonempty_of_submultiplicative_on_pred f p h_mul hp_mul g s hs_nonempty hs
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f : M → N
h_one : f 1 = 1
h_mul : ∀ (x y : M), f (x * y) ≤ f x * f y
s : Finset ι
g : ι → M
⊢ f (∏ i in s, g i) ≤ ∏ i in s, f (g i)
[PROOFSTEP]
refine' le_trans (Multiset.le_prod_of_submultiplicative f h_one h_mul _) _
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f : M → N
h_one : f 1 = 1
h_mul : ∀ (x y : M), f (x * y) ≤ f x * f y
s : Finset ι
g : ι → M
⊢ Multiset.prod (Multiset.map f (Multiset.map (fun i => g i) s.val)) ≤ ∏ i in s, f (g i)
[PROOFSTEP]
rw [Multiset.map_map]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f : M → N
h_one : f 1 = 1
h_mul : ∀ (x y : M), f (x * y) ≤ f x * f y
s : Finset ι
g : ι → M
⊢ Multiset.prod (Multiset.map (f ∘ fun i => g i) s.val) ≤ ∏ i in s, f (g i)
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f g : ι → N
s t : Finset ι
h : ∀ (i : ι), i ∈ s → 1 ≤ f i
⊢ 1 ≤ ∏ i in s, 1
[PROOFSTEP]
rw [prod_const_one]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f g : ι → N
s t : Finset ι
h : ∀ (i : ι), i ∈ s → f i ≤ 1
⊢ ∏ i in s, 1 = 1
[PROOFSTEP]
rw [prod_const_one]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f g : ι → N
s t : Finset ι
h : s ⊆ t
hf : ∀ (i : ι), i ∈ t → ¬i ∈ s → 1 ≤ f i
⊢ ∏ i in s, f i ≤ ∏ i in t, f i
[PROOFSTEP]
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]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f g : ι → N
s t : Finset ι
h : s ⊆ t
hf : ∀ (i : ι), i ∈ t → ¬i ∈ s → 1 ≤ f i
⊢ ∏ i in s, f i ≤ ∏ i in t, f i
[PROOFSTEP]
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]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f g : ι → N
s t : Finset ι
h : s ⊆ t
hf : ∀ (i : ι), i ∈ t → ¬i ∈ s → 1 ≤ f i
⊢ ∀ (i : ι), i ∈ t \ s → 1 ≤ f i
[PROOFSTEP]
simpa only [mem_sdiff, and_imp]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f g : ι → N
s t : Finset ι
h : s ⊆ t
hf : ∀ (i : ι), i ∈ t → ¬i ∈ s → 1 ≤ f i
⊢ ∏ i in t \ s ∪ s, f i = ∏ i in t, f i
[PROOFSTEP]
rw [sdiff_union_of_subset h]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f g : ι → N
s t : Finset ι
⊢ (∀ (i : ι), i ∈ s → 1 ≤ f i) → (∏ i in s, f i = 1 ↔ ∀ (i : ι), i ∈ s → f i = 1)
[PROOFSTEP]
classical
refine Finset.induction_on s (fun _ ↦ ⟨fun _ _ h ↦ False.elim (Finset.not_mem_empty _ h), 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]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f g : ι → N
s t : Finset ι
⊢ (∀ (i : ι), i ∈ s → 1 ≤ f i) → (∏ i in s, f i = 1 ↔ ∀ (i : ι), i ∈ s → f i = 1)
[PROOFSTEP]
refine Finset.induction_on s (fun _ ↦ ⟨fun _ _ h ↦ False.elim (Finset.not_mem_empty _ h), fun _ ↦ rfl⟩) ?_
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f g : ι → N
s t : Finset ι
⊢ ∀ ⦃a : ι⦄ {s : Finset ι},
    ¬a ∈ s →
      ((∀ (i : ι), i ∈ s → 1 ≤ f i) → (∏ i in s, f i = 1 ↔ ∀ (i : ι), i ∈ s → f i = 1)) →
        (∀ (i : ι), i ∈ insert a s → 1 ≤ f i) → (∏ i in insert a s, f i = 1 ↔ ∀ (i : ι), i ∈ insert a s → f i = 1)
[PROOFSTEP]
intro a s ha ih H
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f g : ι → N
s✝ t : Finset ι
a : ι
s : Finset ι
ha : ¬a ∈ s
ih : (∀ (i : ι), i ∈ s → 1 ≤ f i) → (∏ i in s, f i = 1 ↔ ∀ (i : ι), i ∈ s → f i = 1)
H : ∀ (i : ι), i ∈ insert a s → 1 ≤ f i
⊢ ∏ i in insert a s, f i = 1 ↔ ∀ (i : ι), i ∈ insert a s → f i = 1
[PROOFSTEP]
have : ∀ i ∈ s, 1 ≤ f i := fun _ ↦ H _ ∘ mem_insert_of_mem
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f g : ι → N
s✝ t : Finset ι
a : ι
s : Finset ι
ha : ¬a ∈ s
ih : (∀ (i : ι), i ∈ s → 1 ≤ f i) → (∏ i in s, f i = 1 ↔ ∀ (i : ι), i ∈ s → f i = 1)
H : ∀ (i : ι), i ∈ insert a s → 1 ≤ f i
this : ∀ (i : ι), i ∈ s → 1 ≤ f i
⊢ ∏ i in insert a s, f i = 1 ↔ ∀ (i : ι), i ∈ insert a s → f i = 1
[PROOFSTEP]
rw [prod_insert ha, mul_eq_one_iff' (H _ <| mem_insert_self _ _) (one_le_prod' this), forall_mem_insert, ih this]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f✝ g : ι → N
s✝ t s : Finset ι
f : ι → N
n : N
h : ∀ (x : ι), x ∈ s → f x ≤ n
⊢ Finset.prod s f ≤ n ^ card s
[PROOFSTEP]
refine' (Multiset.prod_le_pow_card (s.val.map f) n _).trans _
[GOAL]
case refine'_1
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f✝ g : ι → N
s✝ t s : Finset ι
f : ι → N
n : N
h : ∀ (x : ι), x ∈ s → f x ≤ n
⊢ ∀ (x : N), x ∈ Multiset.map f s.val → x ≤ n
[PROOFSTEP]
simpa using h
[GOAL]
case refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f✝ g : ι → N
s✝ t s : Finset ι
f : ι → N
n : N
h : ∀ (x : ι), x ∈ s → f x ≤ n
⊢ n ^ ↑Multiset.card (Multiset.map f s.val) ≤ n ^ card s
[PROOFSTEP]
simp
[GOAL]
case refine'_2
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : CommMonoid M
inst✝ : OrderedCommMonoid N
f✝ g : ι → N
s✝ t s : Finset ι
f : ι → N
n : N
h : ∀ (x : ι), x ∈ s → f x ≤ n
⊢ n ^ ↑Multiset.card s.val ≤ n ^ card s
[PROOFSTEP]
rfl
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G✝ : Type u_6
k : Type u_7
R : Type u_8
G : Type u_9
inst✝ : LinearOrderedAddCommGroup G
f : ι → G
s : Finset ι
hf : ∀ (i : ι), i ∈ s → 0 ≤ f i
⊢ |∑ i in s, f i| = ∑ i in s, f i
[PROOFSTEP]
rw [abs_of_nonneg (Finset.sum_nonneg hf)]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G✝ : Type u_6
k : Type u_7
R : Type u_8
G : Type u_9
inst✝ : LinearOrderedAddCommGroup G
f : ι → G
s : Finset ι
hf : ∀ (i : ι), 0 ≤ f i
⊢ |∑ i in s, f i| = ∑ i in s, f i
[PROOFSTEP]
rw [abs_of_nonneg (Finset.sum_nonneg' hf)]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq β
f : α → β
s : Finset α
t : Finset β
Hf : ∀ (a : α), a ∈ s → f a ∈ t
n : ℕ
hn : ∀ (a : β), a ∈ t → card (filter (fun x => f x = a) s) ≤ n
⊢ ∑ _a in t, n = n * card t
[PROOFSTEP]
simp [mul_comm]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq β
f : α → β
s : Finset α
t : Finset β
Hf : ∀ (a : α), a ∈ s → f a ∈ t
n : ℕ
hn : ∀ (a : β), a ∈ t → n ≤ card (filter (fun x => f x = a) s)
⊢ n * card t = ∑ _a in t, n
[PROOFSTEP]
simp [mul_comm]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq β
f : α → β
s : Finset α
t : Finset β
Hf : ∀ (a : α), a ∈ s → f a ∈ t
n : ℕ
hn : ∀ (a : β), a ∈ t → n ≤ card (filter (fun x => f x = a) s)
⊢ ∑ a in t, card (filter (fun x => f x = a) s) = card s
[PROOFSTEP]
rw [← card_eq_sum_card_fiberwise Hf]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq α
s : Finset α
B : Finset (Finset α)
n : ℕ
h : ∀ (a : α), a ∈ s → card (filter ((fun x x_1 => x ∈ x_1) a) B) ≤ n
⊢ ∑ t in B, card (s ∩ t) ≤ card s * n
[PROOFSTEP]
refine' le_trans _ (s.sum_le_card_nsmul _ _ h)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq α
s : Finset α
B : Finset (Finset α)
n : ℕ
h : ∀ (a : α), a ∈ s → card (filter ((fun x x_1 => x ∈ x_1) a) B) ≤ n
⊢ ∑ t in B, card (s ∩ t) ≤ ∑ x in s, card (filter ((fun x x_1 => x ∈ x_1) x) B)
[PROOFSTEP]
simp_rw [← filter_mem_eq_inter, card_eq_sum_ones, sum_filter]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq α
s : Finset α
B : Finset (Finset α)
n : ℕ
h : ∀ (a : α), a ∈ s → card (filter ((fun x x_1 => x ∈ x_1) a) B) ≤ n
⊢ (∑ x in B, ∑ a in s, if a ∈ x then 1 else 0) ≤ ∑ x in s, ∑ a in B, if x ∈ a then 1 else 0
[PROOFSTEP]
exact sum_comm.le
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : DecidableEq α
s : Finset α
B : Finset (Finset α)
n : ℕ
inst✝ : Fintype α
h : ∀ (a : α), card (filter ((fun x x_1 => x ∈ x_1) a) B) ≤ n
⊢ ∑ s in B, card s = ∑ s in B, card (univ ∩ s)
[PROOFSTEP]
simp_rw [univ_inter]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq α
s : Finset α
B : Finset (Finset α)
n : ℕ
h : ∀ (a : α), a ∈ s → n ≤ card (filter ((fun x x_1 => x ∈ x_1) a) B)
⊢ card s * n ≤ ∑ t in B, card (s ∩ t)
[PROOFSTEP]
apply (s.card_nsmul_le_sum _ _ h).trans
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq α
s : Finset α
B : Finset (Finset α)
n : ℕ
h : ∀ (a : α), a ∈ s → n ≤ card (filter ((fun x x_1 => x ∈ x_1) a) B)
⊢ ∑ x in s, card (filter ((fun x x_1 => x ∈ x_1) x) B) ≤ ∑ t in B, card (s ∩ t)
[PROOFSTEP]
simp_rw [← filter_mem_eq_inter, card_eq_sum_ones, sum_filter]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq α
s : Finset α
B : Finset (Finset α)
n : ℕ
h : ∀ (a : α), a ∈ s → n ≤ card (filter ((fun x x_1 => x ∈ x_1) a) B)
⊢ (∑ x in s, ∑ a in B, if x ∈ a then 1 else 0) ≤ ∑ x in B, ∑ a in s, if a ∈ x then 1 else 0
[PROOFSTEP]
exact sum_comm.le
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : DecidableEq α
s : Finset α
B : Finset (Finset α)
n : ℕ
inst✝ : Fintype α
h : ∀ (a : α), n ≤ card (filter ((fun x x_1 => x ∈ x_1) a) B)
⊢ ∑ s in B, card (univ ∩ s) = ∑ s in B, card s
[PROOFSTEP]
simp_rw [univ_inter]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : DecidableEq α
s : Finset α
B : Finset (Finset α)
n : ℕ
inst✝ : Fintype α
h : ∀ (a : α), card (filter ((fun x x_1 => x ∈ x_1) a) B) = n
⊢ ∑ s in B, card s = Fintype.card α * n
[PROOFSTEP]
simp_rw [Fintype.card, ← sum_card_inter fun a _ ↦ h a, univ_inter]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq α
s✝ : Finset α
B : Finset (Finset α)
n : ℕ
s : Finset ι
f : ι → Finset α
hs : Set.PairwiseDisjoint (↑s) f
hf : ∀ (i : ι), i ∈ s → Finset.Nonempty (f i)
⊢ card s ≤ card (Finset.biUnion s f)
[PROOFSTEP]
rw [card_biUnion hs, card_eq_sum_ones]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq α
s✝ : Finset α
B : Finset (Finset α)
n : ℕ
s : Finset ι
f : ι → Finset α
hs : Set.PairwiseDisjoint (↑s) f
hf : ∀ (i : ι), i ∈ s → Finset.Nonempty (f i)
⊢ ∑ x in s, 1 ≤ ∑ u in s, card (f u)
[PROOFSTEP]
exact sum_le_sum fun i hi ↦ (hf i hi).card_pos
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq α
s✝ : Finset α
B : Finset (Finset α)
n : ℕ
s : Finset ι
f : ι → Finset α
hs : Set.PairwiseDisjoint (↑s) f
⊢ card s ≤ card (Finset.biUnion s f) + card (filter (fun i => f i = ∅) s)
[PROOFSTEP]
rw [← Finset.filter_card_add_filter_neg_card_eq_card fun i ↦ f i = ∅, add_comm]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : DecidableEq α
s✝ : Finset α
B : Finset (Finset α)
n : ℕ
s : Finset ι
f : ι → Finset α
hs : Set.PairwiseDisjoint (↑s) f
⊢ card (filter (fun a => ¬f a = ∅) s) + card (filter (fun i => f i = ∅) s) ≤
    card (Finset.biUnion s f) + card (filter (fun i => f i = ∅) s)
[PROOFSTEP]
exact
  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 _ _)
    _
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedMonoid M
f : ι → M
s t : Finset ι
h : ∀ (x : ι), x ∈ s → f x ≠ 1 → x ∈ t
⊢ ∏ x in s, f x ≤ ∏ x in t, f x
[PROOFSTEP]
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])
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedMonoid M
f : ι → M
s t : Finset ι
h : ∀ (x : ι), x ∈ s → f x ≠ 1 → x ∈ t
⊢ ∏ x in s, f x ≤ ∏ x in t, f x
[PROOFSTEP]
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])
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedMonoid M
f : ι → M
s t : Finset ι
h : ∀ (x : ι), x ∈ s → f x ≠ 1 → x ∈ t
⊢ ∏ x in s, f x = (∏ x in filter (fun x => f x = 1) s, f x) * ∏ x in filter (fun x => f x ≠ 1) s, f x
[PROOFSTEP]
rw [← prod_union, filter_union_filter_neg_eq]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedMonoid M
f : ι → M
s t : Finset ι
h : ∀ (x : ι), x ∈ s → f x ≠ 1 → x ∈ t
⊢ Disjoint (filter (fun x => f x = 1) s) (filter (fun x => f x ≠ 1) s)
[PROOFSTEP]
exact disjoint_filter.2 fun _ _ h n_h ↦ n_h h
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedMonoid M
f : ι → M
s t : Finset ι
h : ∀ (x : ι), x ∈ s → f x ≠ 1 → x ∈ t
⊢ ∀ (i : ι), i ∈ filter (fun x => f x = 1) s → f i ≤ 1
[PROOFSTEP]
simp only [mem_filter, and_imp]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedMonoid M
f : ι → M
s t : Finset ι
h : ∀ (x : ι), x ∈ s → f x ≠ 1 → x ∈ t
⊢ ∀ (i : ι), i ∈ s → f i = 1 → f i ≤ 1
[PROOFSTEP]
exact fun _ _ ↦ le_of_eq
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedMonoid M
f : ι → M
s t : Finset ι
h : ∀ (x : ι), x ∈ s → f x ≠ 1 → x ∈ t
⊢ filter (fun x => f x ≠ 1) s ⊆ t
[PROOFSTEP]
simpa only [subset_iff, mem_filter, and_imp]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
Hle : ∀ (i : ι), i ∈ s → f i ≤ g i
Hlt : ∃ i, i ∈ s ∧ f i < g i
⊢ ∏ i in s, f i < ∏ i in s, g i
[PROOFSTEP]
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)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
Hle : ∀ (i : ι), i ∈ s → f i ≤ g i
Hlt : ∃ i, i ∈ s ∧ f i < g i
⊢ ∏ i in s, f i < ∏ i in s, g i
[PROOFSTEP]
rcases Hlt with ⟨i, hi, hlt⟩
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
Hle : ∀ (i : ι), i ∈ s → f i ≤ g i
i : ι
hi : i ∈ s
hlt : f i < g i
⊢ ∏ i in s, f i < ∏ i in s, g i
[PROOFSTEP]
rw [← insert_erase hi, prod_insert (not_mem_erase _ _), prod_insert (not_mem_erase _ _)]
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
Hle : ∀ (i : ι), i ∈ s → f i ≤ g i
i : ι
hi : i ∈ s
hlt : f i < g i
⊢ f i * ∏ x in erase s i, f x < g i * ∏ x in erase s i, g x
[PROOFSTEP]
exact mul_lt_mul_of_lt_of_le hlt (prod_le_prod' fun j hj ↦ Hle j <| mem_of_mem_erase hj)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
hs : Finset.Nonempty s
Hlt : ∀ (i : ι), i ∈ s → f i < g i
⊢ ∏ i in s, f i < ∏ i in s, g i
[PROOFSTEP]
apply prod_lt_prod'
[GOAL]
case Hle
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
hs : Finset.Nonempty s
Hlt : ∀ (i : ι), i ∈ s → f i < g i
⊢ ∀ (i : ι), i ∈ s → f i ≤ g i
[PROOFSTEP]
intro i hi
[GOAL]
case Hle
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
hs : Finset.Nonempty s
Hlt : ∀ (i : ι), i ∈ s → f i < g i
i : ι
hi : i ∈ s
⊢ f i ≤ g i
[PROOFSTEP]
apply le_of_lt (Hlt i hi)
[GOAL]
case Hlt
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
hs : Finset.Nonempty s
Hlt : ∀ (i : ι), i ∈ s → f i < g i
⊢ ∃ i, i ∈ s ∧ f i < g i
[PROOFSTEP]
cases' hs with i hi
[GOAL]
case Hlt.intro
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
Hlt : ∀ (i : ι), i ∈ s → f i < g i
i : ι
hi : i ∈ s
⊢ ∃ i, i ∈ s ∧ f i < g i
[PROOFSTEP]
exact ⟨i, hi, Hlt i hi⟩
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
h : s ⊆ t
i : ι
ht : i ∈ t
hs : ¬i ∈ s
hlt : 1 < f i
hle : ∀ (j : ι), j ∈ t → ¬j ∈ s → 1 ≤ f j
⊢ ∏ j in s, f j < ∏ j in t, f j
[PROOFSTEP]
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
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
h : s ⊆ t
i : ι
ht : i ∈ t
hs : ¬i ∈ s
hlt : 1 < f i
hle : ∀ (j : ι), j ∈ t → ¬j ∈ s → 1 ≤ f j
⊢ ∏ j in s, f j < ∏ j in t, f j
[PROOFSTEP]
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
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
h : s ⊆ t
i : ι
ht : i ∈ t
hs : ¬i ∈ s
hlt : 1 < f i
hle : ∀ (j : ι), j ∈ t → ¬j ∈ s → 1 ≤ f j
⊢ ∏ j in s, f j < ∏ j in insert i s, f j
[PROOFSTEP]
rw [prod_insert hs]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
h : s ⊆ t
i : ι
ht : i ∈ t
hs : ¬i ∈ s
hlt : 1 < f i
hle : ∀ (j : ι), j ∈ t → ¬j ∈ s → 1 ≤ f j
⊢ ∏ j in s, f j < f i * ∏ x in s, f x
[PROOFSTEP]
exact lt_mul_of_one_lt_left' (∏ j in s, f j) hlt
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
h : s ⊆ t
i : ι
ht : i ∈ t
hs : ¬i ∈ s
hlt : 1 < f i
hle : ∀ (j : ι), j ∈ t → ¬j ∈ s → 1 ≤ f j
⊢ ∏ j in insert i s, f j ≤ ∏ j in t, f j
[PROOFSTEP]
apply prod_le_prod_of_subset_of_one_le'
[GOAL]
case h
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
h : s ⊆ t
i : ι
ht : i ∈ t
hs : ¬i ∈ s
hlt : 1 < f i
hle : ∀ (j : ι), j ∈ t → ¬j ∈ s → 1 ≤ f j
⊢ insert i s ⊆ t
[PROOFSTEP]
simp [Finset.insert_subset_iff, h, ht]
[GOAL]
case hf
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
h : s ⊆ t
i : ι
ht : i ∈ t
hs : ¬i ∈ s
hlt : 1 < f i
hle : ∀ (j : ι), j ∈ t → ¬j ∈ s → 1 ≤ f j
⊢ ∀ (i_1 : ι), i_1 ∈ t → ¬i_1 ∈ insert i s → 1 ≤ f i_1
[PROOFSTEP]
intro x hx h'x
[GOAL]
case hf
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
h : s ⊆ t
i : ι
ht : i ∈ t
hs : ¬i ∈ s
hlt : 1 < f i
hle : ∀ (j : ι), j ∈ t → ¬j ∈ s → 1 ≤ f j
x : ι
hx : x ∈ t
h'x : ¬x ∈ insert i s
⊢ 1 ≤ f x
[PROOFSTEP]
simp only [mem_insert, not_or] at h'x
[GOAL]
case hf
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
h : s ⊆ t
i : ι
ht : i ∈ t
hs : ¬i ∈ s
hlt : 1 < f i
hle : ∀ (j : ι), j ∈ t → ¬j ∈ s → 1 ≤ f j
x : ι
hx : x ∈ t
h'x : ¬x = i ∧ ¬x ∈ s
⊢ 1 ≤ f x
[PROOFSTEP]
exact hle x hx h'x.2
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
h : ∀ (i : ι), i ∈ s → 1 < f i
hs : Finset.Nonempty s
⊢ 1 ≤ ∏ i in s, 1
[PROOFSTEP]
rw [prod_const_one]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
h : ∀ (i : ι), i ∈ s → f i < 1
hs : Finset.Nonempty s
⊢ ∏ i in s, 1 ≤ 1
[PROOFSTEP]
rw [prod_const_one]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f✝ g✝ : ι → M
s t : Finset ι
f g : ι → M
h : ∀ (i : ι), i ∈ s → f i ≤ g i
⊢ ∏ i in s, f i = ∏ i in s, g i ↔ ∀ (i : ι), i ∈ s → f i = g i
[PROOFSTEP]
classical
revert h
refine
  Finset.induction_on s (fun _ ↦ ⟨fun _ _ h ↦ False.elim (Finset.not_mem_empty _ h), 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)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f✝ g✝ : ι → M
s t : Finset ι
f g : ι → M
h : ∀ (i : ι), i ∈ s → f i ≤ g i
⊢ ∏ i in s, f i = ∏ i in s, g i ↔ ∀ (i : ι), i ∈ s → f i = g i
[PROOFSTEP]
revert h
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f✝ g✝ : ι → M
s t : Finset ι
f g : ι → M
⊢ (∀ (i : ι), i ∈ s → f i ≤ g i) → (∏ i in s, f i = ∏ i in s, g i ↔ ∀ (i : ι), i ∈ s → f i = g i)
[PROOFSTEP]
refine
  Finset.induction_on s (fun _ ↦ ⟨fun _ _ h ↦ False.elim (Finset.not_mem_empty _ h), fun _ ↦ rfl⟩) fun a s ha ih H ↦ ?_
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f✝ g✝ : ι → M
s✝ t : Finset ι
f g : ι → M
a : ι
s : Finset ι
ha : ¬a ∈ s
ih : (∀ (i : ι), i ∈ s → f i ≤ g i) → (∏ i in s, f i = ∏ i in s, g i ↔ ∀ (i : ι), i ∈ s → f i = g i)
H : ∀ (i : ι), i ∈ insert a s → f i ≤ g i
⊢ ∏ i in insert a s, f i = ∏ i in insert a s, g i ↔ ∀ (i : ι), i ∈ insert a s → f i = g i
[PROOFSTEP]
specialize ih fun i ↦ H i ∘ Finset.mem_insert_of_mem
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f✝ g✝ : ι → M
s✝ t : Finset ι
f g : ι → M
a : ι
s : Finset ι
ha : ¬a ∈ s
H : ∀ (i : ι), i ∈ insert a s → f i ≤ g i
ih : ∏ i in s, f i = ∏ i in s, g i ↔ ∀ (i : ι), i ∈ s → f i = g i
⊢ ∏ i in insert a s, f i = ∏ i in insert a s, g i ↔ ∀ (i : ι), i ∈ insert a s → f i = g i
[PROOFSTEP]
rw [Finset.prod_insert ha, Finset.prod_insert ha, Finset.forall_mem_insert, ← ih]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCancelCommMonoid M
f✝ g✝ : ι → M
s✝ t : Finset ι
f g : ι → M
a : ι
s : Finset ι
ha : ¬a ∈ s
H : ∀ (i : ι), i ∈ insert a s → f i ≤ g i
ih : ∏ i in s, f i = ∏ i in s, g i ↔ ∀ (i : ι), i ∈ s → f i = g i
⊢ f a * ∏ x in s, f x = g a * ∏ x in s, g x ↔ f a = g a ∧ ∏ i in s, f i = ∏ i in s, g i
[PROOFSTEP]
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)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : LinearOrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
Hlt : ∏ i in s, f i < ∏ i in s, g i
⊢ ∃ i, i ∈ s ∧ f i < g i
[PROOFSTEP]
contrapose! Hlt with Hle
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : LinearOrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
Hle : ∀ (i : ι), i ∈ s → g i ≤ f i
⊢ ∏ i in s, g i ≤ ∏ i in s, f i
[PROOFSTEP]
exact prod_le_prod' Hle
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : LinearOrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
hs : Finset.Nonempty s
Hle : ∏ i in s, f i ≤ ∏ i in s, g i
⊢ ∃ i, i ∈ s ∧ f i ≤ g i
[PROOFSTEP]
contrapose! Hle with Hlt
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : LinearOrderedCancelCommMonoid M
f g : ι → M
s t : Finset ι
hs : Finset.Nonempty s
Hlt : ∀ (i : ι), i ∈ s → g i < f i
⊢ ∏ i in s, g i < ∏ i in s, f i
[PROOFSTEP]
exact prod_lt_prod_of_nonempty' hs Hlt
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : LinearOrderedCancelCommMonoid M
f✝ g : ι → M
s t : Finset ι
f : ι → M
h₁ : ∏ i in s, f i = 1
h₂ : ∃ i, i ∈ s ∧ f i ≠ 1
⊢ ∃ i, i ∈ s ∧ 1 < f i
[PROOFSTEP]
contrapose! h₁
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : LinearOrderedCancelCommMonoid M
f✝ g : ι → M
s t : Finset ι
f : ι → M
h₂ : ∃ i, i ∈ s ∧ f i ≠ 1
h₁ : ∀ (i : ι), i ∈ s → f i ≤ 1
⊢ ∏ i in s, f i ≠ 1
[PROOFSTEP]
obtain ⟨i, m, i_ne⟩ : ∃ i ∈ s, f i ≠ 1 := h₂
[GOAL]
case intro.intro
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : LinearOrderedCancelCommMonoid M
f✝ g : ι → M
s t : Finset ι
f : ι → M
h₁ : ∀ (i : ι), i ∈ s → f i ≤ 1
i : ι
m : i ∈ s
i_ne : f i ≠ 1
⊢ ∏ i in s, f i ≠ 1
[PROOFSTEP]
apply ne_of_lt
[GOAL]
case intro.intro.h
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : LinearOrderedCancelCommMonoid M
f✝ g : ι → M
s t : Finset ι
f : ι → M
h₁ : ∀ (i : ι), i ∈ s → f i ≤ 1
i : ι
m : i ∈ s
i_ne : f i ≠ 1
⊢ ∏ i in s, f i < 1
[PROOFSTEP]
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
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f g : ι → R
s t : Finset ι
h0 : ∀ (i : ι), i ∈ s → 0 ≤ f i
h1 : ∀ (i : ι), i ∈ s → f i ≤ g i
⊢ ∏ i in s, f i ≤ ∏ i in s, g i
[PROOFSTEP]
induction' s using Finset.induction with a s has ih h
[GOAL]
case empty
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f g : ι → R
s t : Finset ι
h0✝ : ∀ (i : ι), i ∈ s → 0 ≤ f i
h1✝ : ∀ (i : ι), i ∈ s → f i ≤ g i
h0 : ∀ (i : ι), i ∈ ∅ → 0 ≤ f i
h1 : ∀ (i : ι), i ∈ ∅ → f i ≤ g i
⊢ ∏ i in ∅, f i ≤ ∏ i in ∅, g i
[PROOFSTEP]
simp
[GOAL]
case insert
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f g : ι → R
s✝ t : Finset ι
h0✝ : ∀ (i : ι), i ∈ s✝ → 0 ≤ f i
h1✝ : ∀ (i : ι), i ∈ s✝ → f i ≤ g i
a : ι
s : Finset ι
has : ¬a ∈ s
ih : (∀ (i : ι), i ∈ s → 0 ≤ f i) → (∀ (i : ι), i ∈ s → f i ≤ g i) → ∏ i in s, f i ≤ ∏ i in s, g i
h0 : ∀ (i : ι), i ∈ insert a s → 0 ≤ f i
h1 : ∀ (i : ι), i ∈ insert a s → f i ≤ g i
⊢ ∏ i in insert a s, f i ≤ ∏ i in insert a s, g i
[PROOFSTEP]
simp only [prod_insert has]
[GOAL]
case insert
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f g : ι → R
s✝ t : Finset ι
h0✝ : ∀ (i : ι), i ∈ s✝ → 0 ≤ f i
h1✝ : ∀ (i : ι), i ∈ s✝ → f i ≤ g i
a : ι
s : Finset ι
has : ¬a ∈ s
ih : (∀ (i : ι), i ∈ s → 0 ≤ f i) → (∀ (i : ι), i ∈ s → f i ≤ g i) → ∏ i in s, f i ≤ ∏ i in s, g i
h0 : ∀ (i : ι), i ∈ insert a s → 0 ≤ f i
h1 : ∀ (i : ι), i ∈ insert a s → f i ≤ g i
⊢ f a * ∏ i in s, f i ≤ g a * ∏ i in s, g i
[PROOFSTEP]
apply mul_le_mul
[GOAL]
case insert.h₁
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f g : ι → R
s✝ t : Finset ι
h0✝ : ∀ (i : ι), i ∈ s✝ → 0 ≤ f i
h1✝ : ∀ (i : ι), i ∈ s✝ → f i ≤ g i
a : ι
s : Finset ι
has : ¬a ∈ s
ih : (∀ (i : ι), i ∈ s → 0 ≤ f i) → (∀ (i : ι), i ∈ s → f i ≤ g i) → ∏ i in s, f i ≤ ∏ i in s, g i
h0 : ∀ (i : ι), i ∈ insert a s → 0 ≤ f i
h1 : ∀ (i : ι), i ∈ insert a s → f i ≤ g i
⊢ f a ≤ g a
[PROOFSTEP]
exact h1 a (mem_insert_self a s)
[GOAL]
case insert.h₂
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f g : ι → R
s✝ t : Finset ι
h0✝ : ∀ (i : ι), i ∈ s✝ → 0 ≤ f i
h1✝ : ∀ (i : ι), i ∈ s✝ → f i ≤ g i
a : ι
s : Finset ι
has : ¬a ∈ s
ih : (∀ (i : ι), i ∈ s → 0 ≤ f i) → (∀ (i : ι), i ∈ s → f i ≤ g i) → ∏ i in s, f i ≤ ∏ i in s, g i
h0 : ∀ (i : ι), i ∈ insert a s → 0 ≤ f i
h1 : ∀ (i : ι), i ∈ insert a s → f i ≤ g i
⊢ ∏ i in s, f i ≤ ∏ i in s, g i
[PROOFSTEP]
refine ih (fun x H ↦ h0 _ ?_) (fun x H ↦ h1 _ ?_)
[GOAL]
case insert.h₂.refine_1
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f g : ι → R
s✝ t : Finset ι
h0✝ : ∀ (i : ι), i ∈ s✝ → 0 ≤ f i
h1✝ : ∀ (i : ι), i ∈ s✝ → f i ≤ g i
a : ι
s : Finset ι
has : ¬a ∈ s
ih : (∀ (i : ι), i ∈ s → 0 ≤ f i) → (∀ (i : ι), i ∈ s → f i ≤ g i) → ∏ i in s, f i ≤ ∏ i in s, g i
h0 : ∀ (i : ι), i ∈ insert a s → 0 ≤ f i
h1 : ∀ (i : ι), i ∈ insert a s → f i ≤ g i
x : ι
H : x ∈ s
⊢ x ∈ insert a s
[PROOFSTEP]
exact mem_insert_of_mem H
[GOAL]
case insert.h₂.refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f g : ι → R
s✝ t : Finset ι
h0✝ : ∀ (i : ι), i ∈ s✝ → 0 ≤ f i
h1✝ : ∀ (i : ι), i ∈ s✝ → f i ≤ g i
a : ι
s : Finset ι
has : ¬a ∈ s
ih : (∀ (i : ι), i ∈ s → 0 ≤ f i) → (∀ (i : ι), i ∈ s → f i ≤ g i) → ∏ i in s, f i ≤ ∏ i in s, g i
h0 : ∀ (i : ι), i ∈ insert a s → 0 ≤ f i
h1 : ∀ (i : ι), i ∈ insert a s → f i ≤ g i
x : ι
H : x ∈ s
⊢ x ∈ insert a s
[PROOFSTEP]
exact mem_insert_of_mem H
[GOAL]
case insert.c0
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f g : ι → R
s✝ t : Finset ι
h0✝ : ∀ (i : ι), i ∈ s✝ → 0 ≤ f i
h1✝ : ∀ (i : ι), i ∈ s✝ → f i ≤ g i
a : ι
s : Finset ι
has : ¬a ∈ s
ih : (∀ (i : ι), i ∈ s → 0 ≤ f i) → (∀ (i : ι), i ∈ s → f i ≤ g i) → ∏ i in s, f i ≤ ∏ i in s, g i
h0 : ∀ (i : ι), i ∈ insert a s → 0 ≤ f i
h1 : ∀ (i : ι), i ∈ insert a s → f i ≤ g i
⊢ 0 ≤ ∏ i in s, f i
[PROOFSTEP]
apply prod_nonneg fun x H ↦ h0 x (mem_insert_of_mem H)
[GOAL]
case insert.b0
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f g : ι → R
s✝ t : Finset ι
h0✝ : ∀ (i : ι), i ∈ s✝ → 0 ≤ f i
h1✝ : ∀ (i : ι), i ∈ s✝ → f i ≤ g i
a : ι
s : Finset ι
has : ¬a ∈ s
ih : (∀ (i : ι), i ∈ s → 0 ≤ f i) → (∀ (i : ι), i ∈ s → f i ≤ g i) → ∏ i in s, f i ≤ ∏ i in s, g i
h0 : ∀ (i : ι), i ∈ insert a s → 0 ≤ f i
h1 : ∀ (i : ι), i ∈ insert a s → f i ≤ g i
⊢ 0 ≤ g a
[PROOFSTEP]
apply le_trans (h0 a (mem_insert_self a s)) (h1 a (mem_insert_self a s))
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f g : ι → R
s t : Finset ι
h0 : ∀ (i : ι), i ∈ s → 0 ≤ f i
h1 : ∀ (i : ι), i ∈ s → f i ≤ 1
⊢ ∏ i in s, f i ≤ 1
[PROOFSTEP]
convert ← prod_le_prod h0 h1
[GOAL]
case h.e'_4
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f g : ι → R
s t : Finset ι
h0 : ∀ (i : ι), i ∈ s → 0 ≤ f i
h1 : ∀ (i : ι), i ∈ s → f i ≤ 1
⊢ ∏ i in s, 1 = 1
[PROOFSTEP]
exact Finset.prod_const_one
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ ∏ i in s, g i + ∏ i in s, h i ≤ ∏ i in s, f i
[PROOFSTEP]
simp_rw [prod_eq_mul_prod_diff_singleton hi]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ g i * ∏ i in s \ {i}, g i + h i * ∏ i in s \ {i}, h i ≤ f i * ∏ i in s \ {i}, f i
[PROOFSTEP]
refine le_trans ?_ (mul_le_mul_of_nonneg_right h2i ?_)
[GOAL]
case refine_1
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ g i * ∏ i in s \ {i}, g i + h i * ∏ i in s \ {i}, h i ≤ (g i + h i) * ∏ i in s \ {i}, f i
[PROOFSTEP]
rw [right_distrib]
[GOAL]
case refine_1
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ g i * ∏ i in s \ {i}, g i + h i * ∏ i in s \ {i}, h i ≤ g i * ∏ i in s \ {i}, f i + h i * ∏ i in s \ {i}, f i
[PROOFSTEP]
refine add_le_add ?_ ?_
[GOAL]
case refine_1.refine_1
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ g i * ∏ i in s \ {i}, g i ≤ g i * ∏ i in s \ {i}, f i
[PROOFSTEP]
refine mul_le_mul_of_nonneg_left ?_ ?_
[GOAL]
case refine_1.refine_1.refine_1
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ ∏ i in s \ {i}, g i ≤ ∏ i in s \ {i}, f i
[PROOFSTEP]
refine prod_le_prod ?_ ?_
[GOAL]
case refine_1.refine_1.refine_1.refine_1
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ ∀ (i_1 : ι), i_1 ∈ s \ {i} → 0 ≤ g i_1
[PROOFSTEP]
simp (config := { contextual := true }) [*]
[GOAL]
case refine_1.refine_1.refine_1.refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ ∀ (i_1 : ι), i_1 ∈ s \ {i} → g i_1 ≤ f i_1
[PROOFSTEP]
simp (config := { contextual := true }) [*]
[GOAL]
case refine_1.refine_1.refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ 0 ≤ g i
[PROOFSTEP]
try apply_assumption
[GOAL]
case refine_1.refine_1.refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ 0 ≤ g i
[PROOFSTEP]
apply_assumption
[GOAL]
case refine_1.refine_1.refine_2.a
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ i ∈ s
[PROOFSTEP]
try assumption
[GOAL]
case refine_1.refine_1.refine_2.a
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ i ∈ s
[PROOFSTEP]
assumption
[GOAL]
case refine_1.refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ h i * ∏ i in s \ {i}, h i ≤ h i * ∏ i in s \ {i}, f i
[PROOFSTEP]
refine mul_le_mul_of_nonneg_left ?_ ?_
[GOAL]
case refine_1.refine_2.refine_1
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ ∏ i in s \ {i}, h i ≤ ∏ i in s \ {i}, f i
[PROOFSTEP]
refine prod_le_prod ?_ ?_
[GOAL]
case refine_1.refine_2.refine_1.refine_1
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ ∀ (i_1 : ι), i_1 ∈ s \ {i} → 0 ≤ h i_1
[PROOFSTEP]
simp (config := { contextual := true }) [*]
[GOAL]
case refine_1.refine_2.refine_1.refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ ∀ (i_1 : ι), i_1 ∈ s \ {i} → h i_1 ≤ f i_1
[PROOFSTEP]
simp (config := { contextual := true }) [*]
[GOAL]
case refine_1.refine_2.refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ 0 ≤ h i
[PROOFSTEP]
try apply_assumption
[GOAL]
case refine_1.refine_2.refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ 0 ≤ h i
[PROOFSTEP]
apply_assumption
[GOAL]
case refine_1.refine_2.refine_2.a
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ i ∈ s
[PROOFSTEP]
try assumption
[GOAL]
case refine_1.refine_2.refine_2.a
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ i ∈ s
[PROOFSTEP]
assumption
[GOAL]
case refine_2
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ 0 ≤ ∏ i in s \ {i}, f i
[PROOFSTEP]
apply prod_nonneg
[GOAL]
case refine_2.h0
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ ∀ (i_1 : ι), i_1 ∈ s \ {i} → 0 ≤ f i_1
[PROOFSTEP]
simp only [and_imp, mem_sdiff, mem_singleton]
[GOAL]
case refine_2.h0
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
⊢ ∀ (i_1 : ι), i_1 ∈ s → ¬i_1 = i → 0 ≤ f i_1
[PROOFSTEP]
intro j h1j h2j
[GOAL]
case refine_2.h0
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : OrderedCommSemiring R
f✝ g✝ : ι → R
s t : Finset ι
i : ι
f g h : ι → R
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
hg : ∀ (i : ι), i ∈ s → 0 ≤ g i
hh : ∀ (i : ι), i ∈ s → 0 ≤ h i
j : ι
h1j : j ∈ s
h2j : ¬j = i
⊢ 0 ≤ f j
[PROOFSTEP]
exact le_trans (hg j h1j) (hgf j h1j h2j)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ ∏ i in s, g i + ∏ i in s, h i ≤ ∏ i in s, f i
[PROOFSTEP]
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
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ ∏ i in s, g i + ∏ i in s, h i ≤ ∏ i in s, f i
[PROOFSTEP]
simp_rw [prod_eq_mul_prod_diff_singleton hi]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ g i * ∏ i in s \ {i}, g i + h i * ∏ i in s \ {i}, h i ≤ f i * ∏ i in s \ {i}, f i
[PROOFSTEP]
refine' le_trans _ (mul_le_mul_right' h2i _)
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ g i * ∏ i in s \ {i}, g i + h i * ∏ i in s \ {i}, h i ≤ (g i + h i) * ∏ i in s \ {i}, f i
[PROOFSTEP]
rw [right_distrib]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ g i * ∏ i in s \ {i}, g i + h i * ∏ i in s \ {i}, h i ≤ g i * ∏ i in s \ {i}, f i + h i * ∏ i in s \ {i}, f i
[PROOFSTEP]
apply add_le_add
[GOAL]
case h₁
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ g i * ∏ i in s \ {i}, g i ≤ g i * ∏ i in s \ {i}, f i
[PROOFSTEP]
apply mul_le_mul_left'
[GOAL]
case h₂
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ h i * ∏ i in s \ {i}, h i ≤ h i * ∏ i in s \ {i}, f i
[PROOFSTEP]
apply mul_le_mul_left'
[GOAL]
case h₁.bc
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ ∏ i in s \ {i}, g i ≤ ∏ i in s \ {i}, f i
[PROOFSTEP]
apply prod_le_prod'
[GOAL]
case h₂.bc
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ ∏ i in s \ {i}, h i ≤ ∏ i in s \ {i}, f i
[PROOFSTEP]
apply prod_le_prod'
[GOAL]
case h₁.bc.h
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ ∀ (i_1 : ι), i_1 ∈ s \ {i} → g i_1 ≤ f i_1
[PROOFSTEP]
simp only [and_imp, mem_sdiff, mem_singleton]
[GOAL]
case h₂.bc.h
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ ∀ (i_1 : ι), i_1 ∈ s \ {i} → h i_1 ≤ f i_1
[PROOFSTEP]
simp only [and_imp, mem_sdiff, mem_singleton]
[GOAL]
case h₁.bc.h
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ ∀ (i_1 : ι), i_1 ∈ s → ¬i_1 = i → g i_1 ≤ f i_1
[PROOFSTEP]
intros
[GOAL]
case h₂.bc.h
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
⊢ ∀ (i_1 : ι), i_1 ∈ s → ¬i_1 = i → h i_1 ≤ f i_1
[PROOFSTEP]
intros
[GOAL]
case h₁.bc.h
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
i✝ : ι
a✝¹ : i✝ ∈ s
a✝ : ¬i✝ = i
⊢ g i✝ ≤ f i✝
[PROOFSTEP]
apply_assumption
[GOAL]
case h₂.bc.h
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
i✝ : ι
a✝¹ : i✝ ∈ s
a✝ : ¬i✝ = i
⊢ h i✝ ≤ f i✝
[PROOFSTEP]
apply_assumption
[GOAL]
case h₁.bc.h.a
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
i✝ : ι
a✝¹ : i✝ ∈ s
a✝ : ¬i✝ = i
⊢ i✝ ∈ s
[PROOFSTEP]
assumption
[GOAL]
case h₁.bc.h.a
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
i✝ : ι
a✝¹ : i✝ ∈ s
a✝ : ¬i✝ = i
⊢ i✝ ≠ i
[PROOFSTEP]
assumption
[GOAL]
case h₂.bc.h.a
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
i✝ : ι
a✝¹ : i✝ ∈ s
a✝ : ¬i✝ = i
⊢ i✝ ∈ s
[PROOFSTEP]
assumption
[GOAL]
case h₂.bc.h.a
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : CanonicallyOrderedCommSemiring R
f g h : ι → R
s : Finset ι
i : ι
hi : i ∈ s
h2i : g i + h i ≤ f i
hgf : ∀ (j : ι), j ∈ s → j ≠ i → g j ≤ f j
hhf : ∀ (j : ι), j ∈ s → j ≠ i → h j ≤ f j
i✝ : ι
a✝¹ : i✝ ∈ s
a✝ : ¬i✝ = i
⊢ i✝ ≠ i
[PROOFSTEP]
assumption
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : AddCommMonoid M
s : Finset ι
f : ι → WithTop M
⊢ ∑ i in s, f i = ⊤ ↔ ∃ i, i ∈ s ∧ f i = ⊤
[PROOFSTEP]
induction s using Finset.cons_induction
[GOAL]
case empty
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : AddCommMonoid M
f : ι → WithTop M
⊢ ∑ i in ∅, f i = ⊤ ↔ ∃ i, i ∈ ∅ ∧ f i = ⊤
[PROOFSTEP]
simp [*]
[GOAL]
case cons
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝ : AddCommMonoid M
f : ι → WithTop M
a✝¹ : ι
s✝ : Finset ι
h✝ : ¬a✝¹ ∈ s✝
a✝ : ∑ i in s✝, f i = ⊤ ↔ ∃ i, i ∈ s✝ ∧ f i = ⊤
⊢ ∑ i in cons a✝¹ s✝ h✝, f i = ⊤ ↔ ∃ i, i ∈ cons a✝¹ s✝ h✝ ∧ f i = ⊤
[PROOFSTEP]
simp [*]
[GOAL]
ι : Type u_1
α : Type u_2
β : Type u_3
M : Type u_4
N : Type u_5
G : Type u_6
k : Type u_7
R : Type u_8
inst✝¹ : AddCommMonoid M
inst✝ : LT M
s : Finset ι
f : ι → WithTop M
⊢ ∑ i in s, f i < ⊤ ↔ ∀ (i : ι), i ∈ s → f i < ⊤
[PROOFSTEP]
simp only [WithTop.lt_top_iff_ne_top, ne_eq, sum_eq_top_iff, not_exists, not_and]


[GOAL]
C : Type u
inst✝² : Category.{v, u} C
J : Type v
inst✝¹ : SmallCategory J
inst✝ : HasLimits C
X : TopCat
F : J ⥤ Presheaf C X
H : ∀ (j : J), Presheaf.IsSheaf (F.obj j)
c : Cone F
hc : IsLimit c
⊢ Presheaf.IsSheaf c.pt
[PROOFSTEP]
let F' : J ⥤ Sheaf C X :=
  { obj := fun j => ⟨F.obj j, H j⟩
    map := fun f => ⟨F.map f⟩ }
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
J : Type v
inst✝¹ : SmallCategory J
inst✝ : HasLimits C
X : TopCat
F : J ⥤ Presheaf C X
H : ∀ (j : J), Presheaf.IsSheaf (F.obj j)
c : Cone F
hc : IsLimit c
F' : J ⥤ Sheaf C X :=
  CategoryTheory.Functor.mk
    { obj := fun j => { val := F.obj j, cond := (_ : Presheaf.IsSheaf (F.obj j)) },
      map := fun {X_1 Y} f => { val := F.map f } }
⊢ Presheaf.IsSheaf c.pt
[PROOFSTEP]
let e : F' ⋙ Sheaf.forget C X ≅ F := NatIso.ofComponents fun _ => Iso.refl _
[GOAL]
C : Type u
inst✝² : Category.{v, u} C
J : Type v
inst✝¹ : SmallCategory J
inst✝ : HasLimits C
X : TopCat
F : J ⥤ Presheaf C X
H : ∀ (j : J), Presheaf.IsSheaf (F.obj j)
c : Cone F
hc : IsLimit c
F' : J ⥤ Sheaf C X :=
  CategoryTheory.Functor.mk
    { obj := fun j => { val := F.obj j, cond := (_ : Presheaf.IsSheaf (F.obj j)) },
      map := fun {X_1 Y} f => { val := F.map f } }
e : F' ⋙ Sheaf.forget C X ≅ F := NatIso.ofComponents fun x => Iso.refl ((F' ⋙ Sheaf.forget C X).obj x)
⊢ Presheaf.IsSheaf c.pt
[PROOFSTEP]
exact
  Presheaf.isSheaf_of_iso ((isLimitOfPreserves (Sheaf.forget C X) (limit.isLimit F')).conePointsIsoOfNatIso hc e)
    (limit F').2