[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
⊢ ∫ (x : ℝ) in x₀..x₀ + ↑a, f x ≤ ∑ i in Finset.range a, f (x₀ + ↑i)
[PROOFSTEP]
have hint : ∀ k : ℕ, k < a → IntervalIntegrable f volume (x₀ + k) (x₀ + (k + 1 : ℕ)) :=
  by
  intro k hk
  refine' (hf.mono _).intervalIntegrable
  rw [uIcc_of_le]
  · apply Icc_subset_Icc
    · simp only [le_add_iff_nonneg_right, Nat.cast_nonneg]
    · simp only [add_le_add_iff_left, Nat.cast_le, Nat.succ_le_of_lt hk]
  · simp only [add_le_add_iff_left, Nat.cast_le, Nat.le_succ]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
⊢ ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
[PROOFSTEP]
intro k hk
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
k : ℕ
hk : k < a
⊢ IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
[PROOFSTEP]
refine' (hf.mono _).intervalIntegrable
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
k : ℕ
hk : k < a
⊢ uIcc (x₀ + ↑k) (x₀ + ↑(k + 1)) ⊆ Icc x₀ (x₀ + ↑a)
[PROOFSTEP]
rw [uIcc_of_le]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
k : ℕ
hk : k < a
⊢ Icc (x₀ + ↑k) (x₀ + ↑(k + 1)) ⊆ Icc x₀ (x₀ + ↑a)
[PROOFSTEP]
apply Icc_subset_Icc
[GOAL]
case h₁
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
k : ℕ
hk : k < a
⊢ x₀ ≤ x₀ + ↑k
[PROOFSTEP]
simp only [le_add_iff_nonneg_right, Nat.cast_nonneg]
[GOAL]
case h₂
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
k : ℕ
hk : k < a
⊢ x₀ + ↑(k + 1) ≤ x₀ + ↑a
[PROOFSTEP]
simp only [add_le_add_iff_left, Nat.cast_le, Nat.succ_le_of_lt hk]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
k : ℕ
hk : k < a
⊢ x₀ + ↑k ≤ x₀ + ↑(k + 1)
[PROOFSTEP]
simp only [add_le_add_iff_left, Nat.cast_le, Nat.le_succ]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
⊢ ∫ (x : ℝ) in x₀..x₀ + ↑a, f x ≤ ∑ i in Finset.range a, f (x₀ + ↑i)
[PROOFSTEP]
calc
  ∫ x in x₀..x₀ + a, f x = ∑ i in Finset.range a, ∫ x in x₀ + i..x₀ + (i + 1 : ℕ), f x :=
    by
    convert (intervalIntegral.sum_integral_adjacent_intervals hint).symm
    simp only [Nat.cast_zero, add_zero]
  _ ≤ ∑ i in Finset.range a, ∫ _ in x₀ + i..x₀ + (i + 1 : ℕ), f (x₀ + i) :=
    by
    apply Finset.sum_le_sum fun i hi => ?_
    have ia : i < a := Finset.mem_range.1 hi
    refine' intervalIntegral.integral_mono_on (by simp) (hint _ ia) (by simp) fun x hx => _
    apply hf _ _ hx.1
    ·
      simp only [ia.le, mem_Icc, le_add_iff_nonneg_right, Nat.cast_nonneg, add_le_add_iff_left, Nat.cast_le,
        and_self_iff]
    · refine' mem_Icc.2 ⟨le_trans (by simp) hx.1, le_trans hx.2 _⟩
      simp only [add_le_add_iff_left, Nat.cast_le, Nat.succ_le_of_lt ia]
  _ = ∑ i in Finset.range a, f (x₀ + i) := by simp
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
⊢ ∫ (x : ℝ) in x₀..x₀ + ↑a, f x = ∑ i in Finset.range a, ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f x
[PROOFSTEP]
convert (intervalIntegral.sum_integral_adjacent_intervals hint).symm
[GOAL]
case h.e'_2.h.e'_5
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
⊢ x₀ = x₀ + ↑0
[PROOFSTEP]
simp only [Nat.cast_zero, add_zero]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
⊢ ∑ i in Finset.range a, ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f x ≤
    ∑ i in Finset.range a, ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f (x₀ + ↑i)
[PROOFSTEP]
apply Finset.sum_le_sum fun i hi => ?_
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
⊢ ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f x ≤ ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f (x₀ + ↑i)
[PROOFSTEP]
have ia : i < a := Finset.mem_range.1 hi
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i < a
⊢ ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f x ≤ ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f (x₀ + ↑i)
[PROOFSTEP]
refine' intervalIntegral.integral_mono_on (by simp) (hint _ ia) (by simp) fun x hx => _
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i < a
⊢ x₀ + ↑i ≤ x₀ + ↑(i + 1)
[PROOFSTEP]
simp
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i < a
⊢ IntervalIntegrable (fun x => f (x₀ + ↑i)) volume (x₀ + ↑i) (x₀ + ↑(i + 1))
[PROOFSTEP]
simp
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i < a
x : ℝ
hx : x ∈ Icc (x₀ + ↑i) (x₀ + ↑(i + 1))
⊢ f x ≤ f (x₀ + ↑i)
[PROOFSTEP]
apply hf _ _ hx.1
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i < a
x : ℝ
hx : x ∈ Icc (x₀ + ↑i) (x₀ + ↑(i + 1))
⊢ x₀ + ↑i ∈ Icc x₀ (x₀ + ↑a)
[PROOFSTEP]
simp only [ia.le, mem_Icc, le_add_iff_nonneg_right, Nat.cast_nonneg, add_le_add_iff_left, Nat.cast_le, and_self_iff]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i < a
x : ℝ
hx : x ∈ Icc (x₀ + ↑i) (x₀ + ↑(i + 1))
⊢ x ∈ Icc x₀ (x₀ + ↑a)
[PROOFSTEP]
refine' mem_Icc.2 ⟨le_trans (by simp) hx.1, le_trans hx.2 _⟩
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i < a
x : ℝ
hx : x ∈ Icc (x₀ + ↑i) (x₀ + ↑(i + 1))
⊢ x₀ ≤ x₀ + ↑i
[PROOFSTEP]
simp
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i < a
x : ℝ
hx : x ∈ Icc (x₀ + ↑i) (x₀ + ↑(i + 1))
⊢ x₀ + ↑(i + 1) ≤ x₀ + ↑a
[PROOFSTEP]
simp only [add_le_add_iff_left, Nat.cast_le, Nat.succ_le_of_lt ia]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
⊢ ∑ i in Finset.range a, ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f (x₀ + ↑i) = ∑ i in Finset.range a, f (x₀ + ↑i)
[PROOFSTEP]
simp
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
⊢ ∫ (x : ℝ) in ↑a..↑b, f x ≤ ∑ x in Finset.Ico a b, f ↑x
[PROOFSTEP]
rw [(Nat.sub_add_cancel hab).symm, Nat.cast_add]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
⊢ ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x ≤ ∑ x in Finset.Ico a (b - a + a), f ↑x
[PROOFSTEP]
conv =>
  congr
  congr
  ·skip
  ·skip
  rw [add_comm]
  ·skip
  ·skip
  congr
  congr
  rw [← zero_add a]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x ≤ ∑ x in Finset.Ico a (b - a + a), f ↑x
[PROOFSTEP]
  congr
  congr
  ·skip
  ·skip
  rw [add_comm]
  ·skip
  ·skip
  congr
  congr
  rw [← zero_add a]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x ≤ ∑ x in Finset.Ico a (b - a + a), f ↑x
[PROOFSTEP]
  congr
  congr
  ·skip
  ·skip
  rw [add_comm]
  ·skip
  ·skip
  congr
  congr
  rw [← zero_add a]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x ≤ ∑ x in Finset.Ico a (b - a + a), f ↑x
[PROOFSTEP]
congr
[GOAL]
case a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x
case a x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | ∑ x in Finset.Ico a (b - a + a), f ↑x
[PROOFSTEP]
congr
[GOAL]
case a.f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun x => f x
case a.a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ↑a
case a.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ↑(b - a) + ↑a
case a.μ
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| volume
case a x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | ∑ x in Finset.Ico a (b - a + a), f ↑x
[PROOFSTEP]
·skip
[GOAL]
case a.f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun x => f x
[PROOFSTEP]
skip
[GOAL]
case a.f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun x => f x
[PROOFSTEP]
skip
[GOAL]
case a.f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun x => f x
[PROOFSTEP]
skip
[GOAL]
case a.a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ↑a
case a.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ↑(b - a) + ↑a
case a.μ
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| volume
case a x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | ∑ x in Finset.Ico a (b - a + a), f ↑x
[PROOFSTEP]
·skip
[GOAL]
case a.a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ↑a
[PROOFSTEP]
skip
[GOAL]
case a.a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ↑a
[PROOFSTEP]
skip
[GOAL]
case a.a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ↑a
[PROOFSTEP]
skip
[GOAL]
case a.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ↑(b - a) + ↑a
case a.μ
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| volume
case a x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | ∑ x in Finset.Ico a (b - a + a), f ↑x
[PROOFSTEP]
rw [add_comm]
[GOAL]
case a.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ↑a + ↑(b - a)
case a.μ
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| volume
case a x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | ∑ x in Finset.Ico a (b - a + a), f ↑x
[PROOFSTEP]
·skip
[GOAL]
case a.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ↑a + ↑(b - a)
[PROOFSTEP]
skip
[GOAL]
case a.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ↑a + ↑(b - a)
[PROOFSTEP]
skip
[GOAL]
case a.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ↑a + ↑(b - a)
[PROOFSTEP]
skip
[GOAL]
case a.μ
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| volume
case a x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | ∑ x in Finset.Ico a (b - a + a), f ↑x
[PROOFSTEP]
·skip
[GOAL]
case a.μ
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| volume
[PROOFSTEP]
skip
[GOAL]
case a.μ
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| volume
[PROOFSTEP]
skip
[GOAL]
case a.μ
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| volume
[PROOFSTEP]
skip
[GOAL]
case a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∑ x in Finset.Ico a (b - a + a), f ↑x
[PROOFSTEP]
congr
[GOAL]
case a.s
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| Finset.Ico a (b - a + a)
case a.f x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | fun x => f ↑x
[PROOFSTEP]
congr
[GOAL]
case a.s.a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| a
case a.s.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| b - a + a
case a.f x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | fun x => f ↑x
[PROOFSTEP]
rw [← zero_add a]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
⊢ ∫ (x : ℝ) in ↑a..↑a + ↑(b - a), f x ≤ ∑ x in Finset.Ico (0 + a) (b - a + a), f ↑x
[PROOFSTEP]
rw [← Finset.sum_Ico_add, Nat.Ico_zero_eq_range]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
⊢ ∫ (x : ℝ) in ↑a..↑a + ↑(b - a), f x ≤ ∑ x in Finset.range (b - a), f ↑(a + x)
[PROOFSTEP]
conv =>
  rhs
  congr
  ·skip
  ext
  rw [Nat.cast_add]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∫ (x : ℝ) in ↑a..↑a + ↑(b - a), f x ≤ ∑ x in Finset.range (b - a), f ↑(a + x)
[PROOFSTEP]
  rhs
  congr
  ·skip
  ext
  rw [Nat.cast_add]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∫ (x : ℝ) in ↑a..↑a + ↑(b - a), f x ≤ ∑ x in Finset.range (b - a), f ↑(a + x)
[PROOFSTEP]
  rhs
  congr
  ·skip
  ext
  rw [Nat.cast_add]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∫ (x : ℝ) in ↑a..↑a + ↑(b - a), f x ≤ ∑ x in Finset.range (b - a), f ↑(a + x)
[PROOFSTEP]
rhs
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∑ x in Finset.range (b - a), f ↑(a + x)
[PROOFSTEP]
congr
[GOAL]
case s
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| Finset.range (b - a)
case f x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | fun x => f ↑(a + x)
[PROOFSTEP]
·skip
[GOAL]
case s
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| Finset.range (b - a)
[PROOFSTEP]
skip
[GOAL]
case s
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| Finset.range (b - a)
[PROOFSTEP]
skip
[GOAL]
case s
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| Finset.range (b - a)
[PROOFSTEP]
skip
[GOAL]
case f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun x => f ↑(a + x)
[PROOFSTEP]
ext
[GOAL]
case f.h
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
x✝ : ℕ
| f ↑(a + x✝)
[PROOFSTEP]
rw [Nat.cast_add]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
⊢ ∫ (x : ℝ) in ↑a..↑a + ↑(b - a), f x ≤ ∑ x in Finset.range (b - a), f (↑a + ↑x)
[PROOFSTEP]
apply AntitoneOn.integral_le_sum
[GOAL]
case hf
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
⊢ AntitoneOn (fun x => f x) (Icc (↑a) (↑a + ↑(b - a)))
[PROOFSTEP]
simp only [hf, hab, Nat.cast_sub, add_sub_cancel'_right]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
⊢ ∑ i in Finset.range a, f (x₀ + ↑(i + 1)) ≤ ∫ (x : ℝ) in x₀..x₀ + ↑a, f x
[PROOFSTEP]
have hint : ∀ k : ℕ, k < a → IntervalIntegrable f volume (x₀ + k) (x₀ + (k + 1 : ℕ)) :=
  by
  intro k hk
  refine' (hf.mono _).intervalIntegrable
  rw [uIcc_of_le]
  · apply Icc_subset_Icc
    · simp only [le_add_iff_nonneg_right, Nat.cast_nonneg]
    · simp only [add_le_add_iff_left, Nat.cast_le, Nat.succ_le_of_lt hk]
  · simp only [add_le_add_iff_left, Nat.cast_le, Nat.le_succ]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
⊢ ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
[PROOFSTEP]
intro k hk
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
k : ℕ
hk : k < a
⊢ IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
[PROOFSTEP]
refine' (hf.mono _).intervalIntegrable
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
k : ℕ
hk : k < a
⊢ uIcc (x₀ + ↑k) (x₀ + ↑(k + 1)) ⊆ Icc x₀ (x₀ + ↑a)
[PROOFSTEP]
rw [uIcc_of_le]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
k : ℕ
hk : k < a
⊢ Icc (x₀ + ↑k) (x₀ + ↑(k + 1)) ⊆ Icc x₀ (x₀ + ↑a)
[PROOFSTEP]
apply Icc_subset_Icc
[GOAL]
case h₁
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
k : ℕ
hk : k < a
⊢ x₀ ≤ x₀ + ↑k
[PROOFSTEP]
simp only [le_add_iff_nonneg_right, Nat.cast_nonneg]
[GOAL]
case h₂
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
k : ℕ
hk : k < a
⊢ x₀ + ↑(k + 1) ≤ x₀ + ↑a
[PROOFSTEP]
simp only [add_le_add_iff_left, Nat.cast_le, Nat.succ_le_of_lt hk]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
k : ℕ
hk : k < a
⊢ x₀ + ↑k ≤ x₀ + ↑(k + 1)
[PROOFSTEP]
simp only [add_le_add_iff_left, Nat.cast_le, Nat.le_succ]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
⊢ ∑ i in Finset.range a, f (x₀ + ↑(i + 1)) ≤ ∫ (x : ℝ) in x₀..x₀ + ↑a, f x
[PROOFSTEP]
calc
  (∑ i in Finset.range a, f (x₀ + (i + 1 : ℕ))) =
      ∑ i in Finset.range a, ∫ _ in x₀ + i..x₀ + (i + 1 : ℕ), f (x₀ + (i + 1 : ℕ)) :=
    by simp
  _ ≤ ∑ i in Finset.range a, ∫ x in x₀ + i..x₀ + (i + 1 : ℕ), f x :=
    by
    apply Finset.sum_le_sum fun i hi => ?_
    have ia : i + 1 ≤ a := Finset.mem_range.1 hi
    refine' intervalIntegral.integral_mono_on (by simp) (by simp) (hint _ ia) fun x hx => _
    apply hf _ _ hx.2
    · refine' mem_Icc.2 ⟨le_trans ((le_add_iff_nonneg_right _).2 (Nat.cast_nonneg _)) hx.1, le_trans hx.2 _⟩
      simp only [Nat.cast_le, add_le_add_iff_left, ia]
    · refine' mem_Icc.2 ⟨(le_add_iff_nonneg_right _).2 (Nat.cast_nonneg _), _⟩
      simp only [add_le_add_iff_left, Nat.cast_le, ia]
  _ = ∫ x in x₀..x₀ + a, f x :=
    by
    convert intervalIntegral.sum_integral_adjacent_intervals hint
    simp only [Nat.cast_zero, add_zero]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
⊢ ∑ i in Finset.range a, f (x₀ + ↑(i + 1)) =
    ∑ i in Finset.range a, ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f (x₀ + ↑(i + 1))
[PROOFSTEP]
simp
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
⊢ ∑ i in Finset.range a, ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f (x₀ + ↑(i + 1)) ≤
    ∑ i in Finset.range a, ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f x
[PROOFSTEP]
apply Finset.sum_le_sum fun i hi => ?_
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
⊢ ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f (x₀ + ↑(i + 1)) ≤ ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f x
[PROOFSTEP]
have ia : i + 1 ≤ a := Finset.mem_range.1 hi
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i + 1 ≤ a
⊢ ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f (x₀ + ↑(i + 1)) ≤ ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f x
[PROOFSTEP]
refine' intervalIntegral.integral_mono_on (by simp) (by simp) (hint _ ia) fun x hx => _
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i + 1 ≤ a
⊢ x₀ + ↑i ≤ x₀ + ↑(i + 1)
[PROOFSTEP]
simp
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i + 1 ≤ a
⊢ IntervalIntegrable (fun x => f (x₀ + ↑(i + 1))) volume (x₀ + ↑i) (x₀ + ↑(i + 1))
[PROOFSTEP]
simp
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i + 1 ≤ a
x : ℝ
hx : x ∈ Icc (x₀ + ↑i) (x₀ + ↑(i + 1))
⊢ f (x₀ + ↑(i + 1)) ≤ f x
[PROOFSTEP]
apply hf _ _ hx.2
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i + 1 ≤ a
x : ℝ
hx : x ∈ Icc (x₀ + ↑i) (x₀ + ↑(i + 1))
⊢ x ∈ Icc x₀ (x₀ + ↑a)
[PROOFSTEP]
refine' mem_Icc.2 ⟨le_trans ((le_add_iff_nonneg_right _).2 (Nat.cast_nonneg _)) hx.1, le_trans hx.2 _⟩
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i + 1 ≤ a
x : ℝ
hx : x ∈ Icc (x₀ + ↑i) (x₀ + ↑(i + 1))
⊢ x₀ + ↑(i + 1) ≤ x₀ + ↑a
[PROOFSTEP]
simp only [Nat.cast_le, add_le_add_iff_left, ia]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i + 1 ≤ a
x : ℝ
hx : x ∈ Icc (x₀ + ↑i) (x₀ + ↑(i + 1))
⊢ x₀ + ↑(i + 1) ∈ Icc x₀ (x₀ + ↑a)
[PROOFSTEP]
refine' mem_Icc.2 ⟨(le_add_iff_nonneg_right _).2 (Nat.cast_nonneg _), _⟩
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
i : ℕ
hi : i ∈ Finset.range a
ia : i + 1 ≤ a
x : ℝ
hx : x ∈ Icc (x₀ + ↑i) (x₀ + ↑(i + 1))
⊢ x₀ + ↑(i + 1) ≤ x₀ + ↑a
[PROOFSTEP]
simp only [add_le_add_iff_left, Nat.cast_le, ia]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
⊢ ∑ i in Finset.range a, ∫ (x : ℝ) in x₀ + ↑i..x₀ + ↑(i + 1), f x = ∫ (x : ℝ) in x₀..x₀ + ↑a, f x
[PROOFSTEP]
convert intervalIntegral.sum_integral_adjacent_intervals hint
[GOAL]
case h.e'_3.h.e'_5
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : AntitoneOn f (Icc x₀ (x₀ + ↑a))
hint : ∀ (k : ℕ), k < a → IntervalIntegrable f volume (x₀ + ↑k) (x₀ + ↑(k + 1))
⊢ x₀ = x₀ + ↑0
[PROOFSTEP]
simp only [Nat.cast_zero, add_zero]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
⊢ ∑ i in Finset.Ico a b, f ↑(i + 1) ≤ ∫ (x : ℝ) in ↑a..↑b, f x
[PROOFSTEP]
rw [(Nat.sub_add_cancel hab).symm, Nat.cast_add]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
⊢ ∑ i in Finset.Ico a (b - a + a), f ↑(i + 1) ≤ ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x
[PROOFSTEP]
conv =>
  congr
  congr
  congr
  rw [← zero_add a]
  ·skip
  ·skip
  ·skip
  rw [add_comm]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∑ i in Finset.Ico a (b - a + a), f ↑(i + 1) ≤ ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x
[PROOFSTEP]
  congr
  congr
  congr
  rw [← zero_add a]
  ·skip
  ·skip
  ·skip
  rw [add_comm]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∑ i in Finset.Ico a (b - a + a), f ↑(i + 1) ≤ ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x
[PROOFSTEP]
  congr
  congr
  congr
  rw [← zero_add a]
  ·skip
  ·skip
  ·skip
  rw [add_comm]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∑ i in Finset.Ico a (b - a + a), f ↑(i + 1) ≤ ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x
[PROOFSTEP]
congr
[GOAL]
case a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∑ i in Finset.Ico a (b - a + a), f ↑(i + 1)
case a x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x
[PROOFSTEP]
congr
[GOAL]
case a.s
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| Finset.Ico a (b - a + a)
case a.f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun i => f ↑(i + 1)
case a x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x
[PROOFSTEP]
congr
[GOAL]
case a.s.a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| a
case a.s.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| b - a + a
case a.f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun i => f ↑(i + 1)
case a x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x
[PROOFSTEP]
rw [← zero_add a]
[GOAL]
case a.s.a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| 0 + a
case a.s.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| b - a + a
case a.f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun i => f ↑(i + 1)
case a x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x
[PROOFSTEP]
·skip
[GOAL]
case a.s.a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| 0 + a
[PROOFSTEP]
skip
[GOAL]
case a.s.a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| 0 + a
[PROOFSTEP]
skip
[GOAL]
case a.s.a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| 0 + a
[PROOFSTEP]
skip
[GOAL]
case a.s.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| b - a + a
case a.f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun i => f ↑(i + 1)
case a x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x
[PROOFSTEP]
·skip
[GOAL]
case a.s.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| b - a + a
[PROOFSTEP]
skip
[GOAL]
case a.s.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| b - a + a
[PROOFSTEP]
skip
[GOAL]
case a.s.b
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| b - a + a
[PROOFSTEP]
skip
[GOAL]
case a.f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun i => f ↑(i + 1)
case a x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x
[PROOFSTEP]
·skip
[GOAL]
case a.f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun i => f ↑(i + 1)
[PROOFSTEP]
skip
[GOAL]
case a.f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun i => f ↑(i + 1)
[PROOFSTEP]
skip
[GOAL]
case a.f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun i => f ↑(i + 1)
[PROOFSTEP]
skip
[GOAL]
case a
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∫ (x : ℝ) in ↑a..↑(b - a) + ↑a, f x
[PROOFSTEP]
rw [add_comm]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
⊢ ∑ i in Finset.Ico (0 + a) (b - a + a), f ↑(i + 1) ≤ ∫ (x : ℝ) in ↑a..↑a + ↑(b - a), f x
[PROOFSTEP]
rw [← Finset.sum_Ico_add, Nat.Ico_zero_eq_range]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
⊢ ∑ x in Finset.range (b - a), f ↑(a + x + 1) ≤ ∫ (x : ℝ) in ↑a..↑a + ↑(b - a), f x
[PROOFSTEP]
conv =>
  lhs
  congr
  congr
  ·skip
  ext
  rw [add_assoc, Nat.cast_add]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∑ x in Finset.range (b - a), f ↑(a + x + 1) ≤ ∫ (x : ℝ) in ↑a..↑a + ↑(b - a), f x
[PROOFSTEP]
  lhs
  congr
  congr
  ·skip
  ext
  rw [add_assoc, Nat.cast_add]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∑ x in Finset.range (b - a), f ↑(a + x + 1) ≤ ∫ (x : ℝ) in ↑a..↑a + ↑(b - a), f x
[PROOFSTEP]
  lhs
  congr
  congr
  ·skip
  ext
  rw [add_assoc, Nat.cast_add]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∑ x in Finset.range (b - a), f ↑(a + x + 1) ≤ ∫ (x : ℝ) in ↑a..↑a + ↑(b - a), f x
[PROOFSTEP]
lhs
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| ∑ x in Finset.range (b - a), f ↑(a + x + 1)
[PROOFSTEP]
congr
[GOAL]
case s
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| Finset.range (b - a)
case f x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | fun x => f ↑(a + x + 1)
[PROOFSTEP]
congr
[GOAL]
case s.n
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| b - a
case f x₀ : ℝ a b : ℕ f : ℝ → ℝ hab : a ≤ b hf : AntitoneOn f (Icc ↑a ↑b) | fun x => f ↑(a + x + 1)
[PROOFSTEP]
·skip
[GOAL]
case s.n
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| b - a
[PROOFSTEP]
skip
[GOAL]
case s.n
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| b - a
[PROOFSTEP]
skip
[GOAL]
case s.n
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| b - a
[PROOFSTEP]
skip
[GOAL]
case f
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
| fun x => f ↑(a + x + 1)
[PROOFSTEP]
ext
[GOAL]
case f.h
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
x✝ : ℕ
| f ↑(a + x✝ + 1)
[PROOFSTEP]
rw [add_assoc, Nat.cast_add]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
⊢ ∑ x in Finset.range (b - a), f (↑a + ↑(x + 1)) ≤ ∫ (x : ℝ) in ↑a..↑a + ↑(b - a), f x
[PROOFSTEP]
apply AntitoneOn.sum_le_integral
[GOAL]
case hf
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : AntitoneOn f (Icc ↑a ↑b)
⊢ AntitoneOn f (Icc (↑a) (↑a + ↑(b - a)))
[PROOFSTEP]
simp only [hf, hab, Nat.cast_sub, add_sub_cancel'_right]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : MonotoneOn f (Icc x₀ (x₀ + ↑a))
⊢ ∑ i in Finset.range a, f (x₀ + ↑i) ≤ ∫ (x : ℝ) in x₀..x₀ + ↑a, f x
[PROOFSTEP]
rw [← neg_le_neg_iff, ← Finset.sum_neg_distrib, ← intervalIntegral.integral_neg]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : MonotoneOn f (Icc x₀ (x₀ + ↑a))
⊢ ∫ (x : ℝ) in x₀..x₀ + ↑a, -f x ≤ ∑ x in Finset.range a, -f (x₀ + ↑x)
[PROOFSTEP]
exact hf.neg.integral_le_sum
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : MonotoneOn f (Icc ↑a ↑b)
⊢ ∑ x in Finset.Ico a b, f ↑x ≤ ∫ (x : ℝ) in ↑a..↑b, f x
[PROOFSTEP]
rw [← neg_le_neg_iff, ← Finset.sum_neg_distrib, ← intervalIntegral.integral_neg]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : MonotoneOn f (Icc ↑a ↑b)
⊢ ∫ (x : ℝ) in ↑a..↑b, -f x ≤ ∑ x in Finset.Ico a b, -f ↑x
[PROOFSTEP]
exact hf.neg.integral_le_sum_Ico hab
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : MonotoneOn f (Icc x₀ (x₀ + ↑a))
⊢ ∫ (x : ℝ) in x₀..x₀ + ↑a, f x ≤ ∑ i in Finset.range a, f (x₀ + ↑(i + 1))
[PROOFSTEP]
rw [← neg_le_neg_iff, ← Finset.sum_neg_distrib, ← intervalIntegral.integral_neg]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hf : MonotoneOn f (Icc x₀ (x₀ + ↑a))
⊢ ∑ x in Finset.range a, -f (x₀ + ↑(x + 1)) ≤ ∫ (x : ℝ) in x₀..x₀ + ↑a, -f x
[PROOFSTEP]
exact hf.neg.sum_le_integral
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : MonotoneOn f (Icc ↑a ↑b)
⊢ ∫ (x : ℝ) in ↑a..↑b, f x ≤ ∑ i in Finset.Ico a b, f ↑(i + 1)
[PROOFSTEP]
rw [← neg_le_neg_iff, ← Finset.sum_neg_distrib, ← intervalIntegral.integral_neg]
[GOAL]
x₀ : ℝ
a b : ℕ
f : ℝ → ℝ
hab : a ≤ b
hf : MonotoneOn f (Icc ↑a ↑b)
⊢ ∑ x in Finset.Ico a b, -f ↑(x + 1) ≤ ∫ (x : ℝ) in ↑a..↑b, -f x
[PROOFSTEP]
exact hf.neg.sum_le_integral_Ico hab


[GOAL]
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝⁹ : Finite ι
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : Module R M₂
inst✝⁵ : Module.Finite R M₂
inst✝⁴ : Module.Free R M₂
n : ℕ
N : Fin n → Type u_5
inst✝³ : (i : Fin n) → AddCommGroup (N i)
inst✝² : (i : Fin n) → Module R (N i)
inst✝¹ : ∀ (i : Fin n), Module.Finite R (N i)
inst✝ : ∀ (i : Fin n), Module.Free R (N i)
⊢ Module.Free R (MultilinearMap R N M₂) ∧ Module.Finite R (MultilinearMap R N M₂)
[PROOFSTEP]
induction' n with n ih
[GOAL]
case zero
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝¹³ : Finite ι
inst✝¹² : CommRing R
inst✝¹¹ : AddCommGroup M₂
inst✝¹⁰ : Module R M₂
inst✝⁹ : Module.Finite R M₂
inst✝⁸ : Module.Free R M₂
n : ℕ
N✝ : Fin n → Type u_5
inst✝⁷ : (i : Fin n) → AddCommGroup (N✝ i)
inst✝⁶ : (i : Fin n) → Module R (N✝ i)
inst✝⁵ : ∀ (i : Fin n), Module.Finite R (N✝ i)
inst✝⁴ : ∀ (i : Fin n), Module.Free R (N✝ i)
N : Fin Nat.zero → Type u_5
inst✝³ : (i : Fin Nat.zero) → AddCommGroup (N i)
inst✝² : (i : Fin Nat.zero) → Module R (N i)
inst✝¹ : ∀ (i : Fin Nat.zero), Module.Finite R (N i)
inst✝ : ∀ (i : Fin Nat.zero), Module.Free R (N i)
⊢ Module.Free R (MultilinearMap R N M₂) ∧ Module.Finite R (MultilinearMap R N M₂)
[PROOFSTEP]
haveI : IsEmpty (Fin Nat.zero) := inferInstanceAs (IsEmpty (Fin 0))
[GOAL]
case zero
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝¹³ : Finite ι
inst✝¹² : CommRing R
inst✝¹¹ : AddCommGroup M₂
inst✝¹⁰ : Module R M₂
inst✝⁹ : Module.Finite R M₂
inst✝⁸ : Module.Free R M₂
n : ℕ
N✝ : Fin n → Type u_5
inst✝⁷ : (i : Fin n) → AddCommGroup (N✝ i)
inst✝⁶ : (i : Fin n) → Module R (N✝ i)
inst✝⁵ : ∀ (i : Fin n), Module.Finite R (N✝ i)
inst✝⁴ : ∀ (i : Fin n), Module.Free R (N✝ i)
N : Fin Nat.zero → Type u_5
inst✝³ : (i : Fin Nat.zero) → AddCommGroup (N i)
inst✝² : (i : Fin Nat.zero) → Module R (N i)
inst✝¹ : ∀ (i : Fin Nat.zero), Module.Finite R (N i)
inst✝ : ∀ (i : Fin Nat.zero), Module.Free R (N i)
this : IsEmpty (Fin Nat.zero)
⊢ Module.Free R (MultilinearMap R N M₂) ∧ Module.Finite R (MultilinearMap R N M₂)
[PROOFSTEP]
exact ⟨Module.Free.of_equiv (constLinearEquivOfIsEmpty R N M₂), Module.Finite.equiv (constLinearEquivOfIsEmpty R N M₂)⟩
[GOAL]
case succ
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝¹³ : Finite ι
inst✝¹² : CommRing R
inst✝¹¹ : AddCommGroup M₂
inst✝¹⁰ : Module R M₂
inst✝⁹ : Module.Finite R M₂
inst✝⁸ : Module.Free R M₂
n✝ : ℕ
N✝ : Fin n✝ → Type u_5
inst✝⁷ : (i : Fin n✝) → AddCommGroup (N✝ i)
inst✝⁶ : (i : Fin n✝) → Module R (N✝ i)
inst✝⁵ : ∀ (i : Fin n✝), Module.Finite R (N✝ i)
inst✝⁴ : ∀ (i : Fin n✝), Module.Free R (N✝ i)
n : ℕ
ih :
  ∀ (N : Fin n → Type u_5) [inst : (i : Fin n) → AddCommGroup (N i)] [inst_1 : (i : Fin n) → Module R (N i)]
    [inst_2 : ∀ (i : Fin n), Module.Finite R (N i)] [inst_3 : ∀ (i : Fin n), Module.Free R (N i)],
    Module.Free R (MultilinearMap R N M₂) ∧ Module.Finite R (MultilinearMap R N M₂)
N : Fin (Nat.succ n) → Type u_5
inst✝³ : (i : Fin (Nat.succ n)) → AddCommGroup (N i)
inst✝² : (i : Fin (Nat.succ n)) → Module R (N i)
inst✝¹ : ∀ (i : Fin (Nat.succ n)), Module.Finite R (N i)
inst✝ : ∀ (i : Fin (Nat.succ n)), Module.Free R (N i)
⊢ Module.Free R (MultilinearMap R N M₂) ∧ Module.Finite R (MultilinearMap R N M₂)
[PROOFSTEP]
suffices
  Module.Free R (N 0 →ₗ[R] MultilinearMap R (fun i : Fin n => N i.succ) M₂) ∧
    Module.Finite R (N 0 →ₗ[R] MultilinearMap R (fun i : Fin n => N i.succ) M₂)
  by
  cases this
  exact
    ⟨Module.Free.of_equiv (multilinearCurryLeftEquiv R N M₂), Module.Finite.equiv (multilinearCurryLeftEquiv R N M₂)⟩
[GOAL]
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝¹³ : Finite ι
inst✝¹² : CommRing R
inst✝¹¹ : AddCommGroup M₂
inst✝¹⁰ : Module R M₂
inst✝⁹ : Module.Finite R M₂
inst✝⁸ : Module.Free R M₂
n✝ : ℕ
N✝ : Fin n✝ → Type u_5
inst✝⁷ : (i : Fin n✝) → AddCommGroup (N✝ i)
inst✝⁶ : (i : Fin n✝) → Module R (N✝ i)
inst✝⁵ : ∀ (i : Fin n✝), Module.Finite R (N✝ i)
inst✝⁴ : ∀ (i : Fin n✝), Module.Free R (N✝ i)
n : ℕ
ih :
  ∀ (N : Fin n → Type u_5) [inst : (i : Fin n) → AddCommGroup (N i)] [inst_1 : (i : Fin n) → Module R (N i)]
    [inst_2 : ∀ (i : Fin n), Module.Finite R (N i)] [inst_3 : ∀ (i : Fin n), Module.Free R (N i)],
    Module.Free R (MultilinearMap R N M₂) ∧ Module.Finite R (MultilinearMap R N M₂)
N : Fin (Nat.succ n) → Type u_5
inst✝³ : (i : Fin (Nat.succ n)) → AddCommGroup (N i)
inst✝² : (i : Fin (Nat.succ n)) → Module R (N i)
inst✝¹ : ∀ (i : Fin (Nat.succ n)), Module.Finite R (N i)
inst✝ : ∀ (i : Fin (Nat.succ n)), Module.Free R (N i)
this :
  Module.Free R (N 0 →ₗ[R] MultilinearMap R (fun i => N (Fin.succ i)) M₂) ∧
    Module.Finite R (N 0 →ₗ[R] MultilinearMap R (fun i => N (Fin.succ i)) M₂)
⊢ Module.Free R (MultilinearMap R N M₂) ∧ Module.Finite R (MultilinearMap R N M₂)
[PROOFSTEP]
cases this
[GOAL]
case intro
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝¹³ : Finite ι
inst✝¹² : CommRing R
inst✝¹¹ : AddCommGroup M₂
inst✝¹⁰ : Module R M₂
inst✝⁹ : Module.Finite R M₂
inst✝⁸ : Module.Free R M₂
n✝ : ℕ
N✝ : Fin n✝ → Type u_5
inst✝⁷ : (i : Fin n✝) → AddCommGroup (N✝ i)
inst✝⁶ : (i : Fin n✝) → Module R (N✝ i)
inst✝⁵ : ∀ (i : Fin n✝), Module.Finite R (N✝ i)
inst✝⁴ : ∀ (i : Fin n✝), Module.Free R (N✝ i)
n : ℕ
ih :
  ∀ (N : Fin n → Type u_5) [inst : (i : Fin n) → AddCommGroup (N i)] [inst_1 : (i : Fin n) → Module R (N i)]
    [inst_2 : ∀ (i : Fin n), Module.Finite R (N i)] [inst_3 : ∀ (i : Fin n), Module.Free R (N i)],
    Module.Free R (MultilinearMap R N M₂) ∧ Module.Finite R (MultilinearMap R N M₂)
N : Fin (Nat.succ n) → Type u_5
inst✝³ : (i : Fin (Nat.succ n)) → AddCommGroup (N i)
inst✝² : (i : Fin (Nat.succ n)) → Module R (N i)
inst✝¹ : ∀ (i : Fin (Nat.succ n)), Module.Finite R (N i)
inst✝ : ∀ (i : Fin (Nat.succ n)), Module.Free R (N i)
left✝ : Module.Free R (N 0 →ₗ[R] MultilinearMap R (fun i => N (Fin.succ i)) M₂)
right✝ : Module.Finite R (N 0 →ₗ[R] MultilinearMap R (fun i => N (Fin.succ i)) M₂)
⊢ Module.Free R (MultilinearMap R N M₂) ∧ Module.Finite R (MultilinearMap R N M₂)
[PROOFSTEP]
exact ⟨Module.Free.of_equiv (multilinearCurryLeftEquiv R N M₂), Module.Finite.equiv (multilinearCurryLeftEquiv R N M₂)⟩
[GOAL]
case succ
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝¹³ : Finite ι
inst✝¹² : CommRing R
inst✝¹¹ : AddCommGroup M₂
inst✝¹⁰ : Module R M₂
inst✝⁹ : Module.Finite R M₂
inst✝⁸ : Module.Free R M₂
n✝ : ℕ
N✝ : Fin n✝ → Type u_5
inst✝⁷ : (i : Fin n✝) → AddCommGroup (N✝ i)
inst✝⁶ : (i : Fin n✝) → Module R (N✝ i)
inst✝⁵ : ∀ (i : Fin n✝), Module.Finite R (N✝ i)
inst✝⁴ : ∀ (i : Fin n✝), Module.Free R (N✝ i)
n : ℕ
ih :
  ∀ (N : Fin n → Type u_5) [inst : (i : Fin n) → AddCommGroup (N i)] [inst_1 : (i : Fin n) → Module R (N i)]
    [inst_2 : ∀ (i : Fin n), Module.Finite R (N i)] [inst_3 : ∀ (i : Fin n), Module.Free R (N i)],
    Module.Free R (MultilinearMap R N M₂) ∧ Module.Finite R (MultilinearMap R N M₂)
N : Fin (Nat.succ n) → Type u_5
inst✝³ : (i : Fin (Nat.succ n)) → AddCommGroup (N i)
inst✝² : (i : Fin (Nat.succ n)) → Module R (N i)
inst✝¹ : ∀ (i : Fin (Nat.succ n)), Module.Finite R (N i)
inst✝ : ∀ (i : Fin (Nat.succ n)), Module.Free R (N i)
⊢ Module.Free R (N 0 →ₗ[R] MultilinearMap R (fun i => N (Fin.succ i)) M₂) ∧
    Module.Finite R (N 0 →ₗ[R] MultilinearMap R (fun i => N (Fin.succ i)) M₂)
[PROOFSTEP]
cases ih fun i => N i.succ
[GOAL]
case succ.intro
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝¹³ : Finite ι
inst✝¹² : CommRing R
inst✝¹¹ : AddCommGroup M₂
inst✝¹⁰ : Module R M₂
inst✝⁹ : Module.Finite R M₂
inst✝⁸ : Module.Free R M₂
n✝ : ℕ
N✝ : Fin n✝ → Type u_5
inst✝⁷ : (i : Fin n✝) → AddCommGroup (N✝ i)
inst✝⁶ : (i : Fin n✝) → Module R (N✝ i)
inst✝⁵ : ∀ (i : Fin n✝), Module.Finite R (N✝ i)
inst✝⁴ : ∀ (i : Fin n✝), Module.Free R (N✝ i)
n : ℕ
ih :
  ∀ (N : Fin n → Type u_5) [inst : (i : Fin n) → AddCommGroup (N i)] [inst_1 : (i : Fin n) → Module R (N i)]
    [inst_2 : ∀ (i : Fin n), Module.Finite R (N i)] [inst_3 : ∀ (i : Fin n), Module.Free R (N i)],
    Module.Free R (MultilinearMap R N M₂) ∧ Module.Finite R (MultilinearMap R N M₂)
N : Fin (Nat.succ n) → Type u_5
inst✝³ : (i : Fin (Nat.succ n)) → AddCommGroup (N i)
inst✝² : (i : Fin (Nat.succ n)) → Module R (N i)
inst✝¹ : ∀ (i : Fin (Nat.succ n)), Module.Finite R (N i)
inst✝ : ∀ (i : Fin (Nat.succ n)), Module.Free R (N i)
left✝ : Module.Free R (MultilinearMap R (fun i => N (Fin.succ i)) M₂)
right✝ : Module.Finite R (MultilinearMap R (fun i => N (Fin.succ i)) M₂)
⊢ Module.Free R (N 0 →ₗ[R] MultilinearMap R (fun i => N (Fin.succ i)) M₂) ∧
    Module.Finite R (N 0 →ₗ[R] MultilinearMap R (fun i => N (Fin.succ i)) M₂)
[PROOFSTEP]
exact ⟨Module.Free.linearMap _ _ _, Module.Finite.linearMap _ _⟩
[GOAL]
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝⁹ : Finite ι
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : Module R M₂
inst✝⁵ : Module.Finite R M₂
inst✝⁴ : Module.Free R M₂
inst✝³ : (i : ι) → AddCommGroup (M₁ i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : ∀ (i : ι), Module.Finite R (M₁ i)
inst✝ : ∀ (i : ι), Module.Free R (M₁ i)
⊢ Module.Free R (MultilinearMap R M₁ M₂) ∧ Module.Finite R (MultilinearMap R M₁ M₂)
[PROOFSTEP]
cases nonempty_fintype ι
[GOAL]
case intro
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝⁹ : Finite ι
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : Module R M₂
inst✝⁵ : Module.Finite R M₂
inst✝⁴ : Module.Free R M₂
inst✝³ : (i : ι) → AddCommGroup (M₁ i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : ∀ (i : ι), Module.Finite R (M₁ i)
inst✝ : ∀ (i : ι), Module.Free R (M₁ i)
val✝ : Fintype ι
⊢ Module.Free R (MultilinearMap R M₁ M₂) ∧ Module.Finite R (MultilinearMap R M₁ M₂)
[PROOFSTEP]
have := @free_and_finite_fin R M₂ _ _ _ _ _ (Fintype.card ι) (fun x => M₁ ((Fintype.equivFin ι).symm x))
[GOAL]
case intro
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝⁹ : Finite ι
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : Module R M₂
inst✝⁵ : Module.Finite R M₂
inst✝⁴ : Module.Free R M₂
inst✝³ : (i : ι) → AddCommGroup (M₁ i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : ∀ (i : ι), Module.Finite R (M₁ i)
inst✝ : ∀ (i : ι), Module.Free R (M₁ i)
val✝ : Fintype ι
this :
  ∀ [inst : (i : Fin (Fintype.card ι)) → AddCommGroup (M₁ (↑(Fintype.equivFin ι).symm i))]
    [inst_1 : (i : Fin (Fintype.card ι)) → Module R (M₁ (↑(Fintype.equivFin ι).symm i))]
    [inst_2 : ∀ (i : Fin (Fintype.card ι)), Module.Finite R (M₁ (↑(Fintype.equivFin ι).symm i))]
    [inst_3 : ∀ (i : Fin (Fintype.card ι)), Module.Free R (M₁ (↑(Fintype.equivFin ι).symm i))],
    Module.Free R (MultilinearMap R (fun x => M₁ (↑(Fintype.equivFin ι).symm x)) M₂) ∧
      Module.Finite R (MultilinearMap R (fun x => M₁ (↑(Fintype.equivFin ι).symm x)) M₂)
⊢ Module.Free R (MultilinearMap R M₁ M₂) ∧ Module.Finite R (MultilinearMap R M₁ M₂)
[PROOFSTEP]
cases' this with l r
[GOAL]
case intro.intro
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝⁹ : Finite ι
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : Module R M₂
inst✝⁵ : Module.Finite R M₂
inst✝⁴ : Module.Free R M₂
inst✝³ : (i : ι) → AddCommGroup (M₁ i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : ∀ (i : ι), Module.Finite R (M₁ i)
inst✝ : ∀ (i : ι), Module.Free R (M₁ i)
val✝ : Fintype ι
this :
  ∀ [inst : (i : Fin (Fintype.card ι)) → AddCommGroup (M₁ (↑(Fintype.equivFin ι).symm i))]
    [inst_1 : (i : Fin (Fintype.card ι)) → Module R (M₁ (↑(Fintype.equivFin ι).symm i))]
    [inst_2 : ∀ (i : Fin (Fintype.card ι)), Module.Finite R (M₁ (↑(Fintype.equivFin ι).symm i))]
    [inst_3 : ∀ (i : Fin (Fintype.card ι)), Module.Free R (M₁ (↑(Fintype.equivFin ι).symm i))],
    Module.Free R (MultilinearMap R (fun x => M₁ (↑(Fintype.equivFin ι).symm x)) M₂) ∧
      Module.Finite R (MultilinearMap R (fun x => M₁ (↑(Fintype.equivFin ι).symm x)) M₂)
l : Module.Free R (MultilinearMap R (fun x => M₁ (↑(Fintype.equivFin ι).symm x)) M₂)
r : Module.Finite R (MultilinearMap R (fun x => M₁ (↑(Fintype.equivFin ι).symm x)) M₂)
⊢ Module.Free R (MultilinearMap R M₁ M₂) ∧ Module.Finite R (MultilinearMap R M₁ M₂)
[PROOFSTEP]
have e := domDomCongrLinearEquiv' R M₁ M₂ (Fintype.equivFin ι)
[GOAL]
case intro.intro
ι : Type u_1
R : Type u_2
M₂ : Type u_3
M₁ : ι → Type u_4
inst✝⁹ : Finite ι
inst✝⁸ : CommRing R
inst✝⁷ : AddCommGroup M₂
inst✝⁶ : Module R M₂
inst✝⁵ : Module.Finite R M₂
inst✝⁴ : Module.Free R M₂
inst✝³ : (i : ι) → AddCommGroup (M₁ i)
inst✝² : (i : ι) → Module R (M₁ i)
inst✝¹ : ∀ (i : ι), Module.Finite R (M₁ i)
inst✝ : ∀ (i : ι), Module.Free R (M₁ i)
val✝ : Fintype ι
this :
  ∀ [inst : (i : Fin (Fintype.card ι)) → AddCommGroup (M₁ (↑(Fintype.equivFin ι).symm i))]
    [inst_1 : (i : Fin (Fintype.card ι)) → Module R (M₁ (↑(Fintype.equivFin ι).symm i))]
    [inst_2 : ∀ (i : Fin (Fintype.card ι)), Module.Finite R (M₁ (↑(Fintype.equivFin ι).symm i))]
    [inst_3 : ∀ (i : Fin (Fintype.card ι)), Module.Free R (M₁ (↑(Fintype.equivFin ι).symm i))],
    Module.Free R (MultilinearMap R (fun x => M₁ (↑(Fintype.equivFin ι).symm x)) M₂) ∧
      Module.Finite R (MultilinearMap R (fun x => M₁ (↑(Fintype.equivFin ι).symm x)) M₂)
l : Module.Free R (MultilinearMap R (fun x => M₁ (↑(Fintype.equivFin ι).symm x)) M₂)
r : Module.Finite R (MultilinearMap R (fun x => M₁ (↑(Fintype.equivFin ι).symm x)) M₂)
e : MultilinearMap R M₁ M₂ ≃ₗ[R] MultilinearMap R (fun i => M₁ (↑(Fintype.equivFin ι).symm i)) M₂
⊢ Module.Free R (MultilinearMap R M₁ M₂) ∧ Module.Finite R (MultilinearMap R M₁ M₂)
[PROOFSTEP]
exact ⟨Module.Free.of_equiv e.symm, Module.Finite.equiv e.symm⟩


[GOAL]
C : Type u_1
inst✝² : Category.{?u.1346, u_1} C
inst✝¹ : Preadditive C
inst✝ : HasFiniteCoproducts C
P : Karoubi (SimplicialObject C)
⊢ N.map (NatTrans.app Γ₂N₂.hom P) ≫ NatTrans.app N₂Γ₂.hom (N.obj P) = 𝟙 (N.obj P)
[PROOFSTEP]
let α := N.mapIso (Γ₂N₂.app P)
[GOAL]
C : Type u_1
inst✝² : Category.{?u.1346, u_1} C
inst✝¹ : Preadditive C
inst✝ : HasFiniteCoproducts C
P : Karoubi (SimplicialObject C)
α : N.obj ((𝟭 (Karoubi (SimplicialObject C))).obj P) ≅ N.obj ((N₂ ⋙ Γ₂).obj P) := N.mapIso (Γ₂N₂.app P)
⊢ N.map (NatTrans.app Γ₂N₂.hom P) ≫ NatTrans.app N₂Γ₂.hom (N.obj P) = 𝟙 (N.obj P)
[PROOFSTEP]
let β := N₂Γ₂.app (N.obj P)
[GOAL]
C : Type u_1
inst✝² : Category.{?u.1346, u_1} C
inst✝¹ : Preadditive C
inst✝ : HasFiniteCoproducts C
P : Karoubi (SimplicialObject C)
α : N.obj ((𝟭 (Karoubi (SimplicialObject C))).obj P) ≅ N.obj ((N₂ ⋙ Γ₂).obj P) := N.mapIso (Γ₂N₂.app P)
β : (Γ₂ ⋙ N₂).obj (N.obj P) ≅ (𝟭 (Karoubi (ChainComplex C ℕ))).obj (N.obj P) := N₂Γ₂.app (N.obj P)
⊢ N.map (NatTrans.app Γ₂N₂.hom P) ≫ NatTrans.app N₂Γ₂.hom (N.obj P) = 𝟙 (N.obj P)
[PROOFSTEP]
symm
[GOAL]
C : Type u_1
inst✝² : Category.{?u.1346, u_1} C
inst✝¹ : Preadditive C
inst✝ : HasFiniteCoproducts C
P : Karoubi (SimplicialObject C)
α : N.obj ((𝟭 (Karoubi (SimplicialObject C))).obj P) ≅ N.obj ((N₂ ⋙ Γ₂).obj P) := N.mapIso (Γ₂N₂.app P)
β : (Γ₂ ⋙ N₂).obj (N.obj P) ≅ (𝟭 (Karoubi (ChainComplex C ℕ))).obj (N.obj P) := N₂Γ₂.app (N.obj P)
⊢ 𝟙 (N.obj P) = N.map (NatTrans.app Γ₂N₂.hom P) ≫ NatTrans.app N₂Γ₂.hom (N.obj P)
[PROOFSTEP]
change 𝟙 _ = α.hom ≫ β.hom
[GOAL]
C : Type u_1
inst✝² : Category.{?u.1346, u_1} C
inst✝¹ : Preadditive C
inst✝ : HasFiniteCoproducts C
P : Karoubi (SimplicialObject C)
α : N.obj ((𝟭 (Karoubi (SimplicialObject C))).obj P) ≅ N.obj ((N₂ ⋙ Γ₂).obj P) := N.mapIso (Γ₂N₂.app P)
β : (Γ₂ ⋙ N₂).obj (N.obj P) ≅ (𝟭 (Karoubi (ChainComplex C ℕ))).obj (N.obj P) := N₂Γ₂.app (N.obj P)
⊢ 𝟙 (N.obj ((𝟭 (Karoubi (SimplicialObject C))).obj P)) = α.hom ≫ β.hom
[PROOFSTEP]
rw [← Iso.inv_comp_eq, comp_id, ← comp_id β.hom, ← Iso.inv_comp_eq]
[GOAL]
C : Type u_1
inst✝² : Category.{?u.1346, u_1} C
inst✝¹ : Preadditive C
inst✝ : HasFiniteCoproducts C
P : Karoubi (SimplicialObject C)
α : N.obj ((𝟭 (Karoubi (SimplicialObject C))).obj P) ≅ N.obj ((N₂ ⋙ Γ₂).obj P) := N.mapIso (Γ₂N₂.app P)
β : (Γ₂ ⋙ N₂).obj (N.obj P) ≅ (𝟭 (Karoubi (ChainComplex C ℕ))).obj (N.obj P) := N₂Γ₂.app (N.obj P)
⊢ β.inv ≫ α.inv = 𝟙 ((𝟭 (Karoubi (ChainComplex C ℕ))).obj (N.obj P))
[PROOFSTEP]
exact AlgebraicTopology.DoldKan.identity_N₂_objectwise P


[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
f : α → β
⊢ InjOn f (f ⁻¹' ↑∅)
[PROOFSTEP]
simp [InjOn]
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
f : α → β
⊢ ↑(preimage ∅ f (_ : ∀ (a : α), a ∈ f ⁻¹' ↑∅ → ∀ (a_2 : α), a_2 ∈ f ⁻¹' ↑∅ → f a = f a_2 → a = a_2)) = ↑∅
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
f : α → β
inst✝¹ : Fintype α
inst✝ : Fintype β
hf : InjOn f (f ⁻¹' ↑univ)
⊢ ↑(preimage univ f hf) = ↑univ
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → β
s t : Finset β
hs : InjOn f (f ⁻¹' ↑s)
ht : InjOn f (f ⁻¹' ↑t)
⊢ ↑(preimage (s ∩ t) f
        (_ : ∀ (x₁ : α), x₁ ∈ f ⁻¹' ↑(s ∩ t) → ∀ (x₂ : α), x₂ ∈ f ⁻¹' ↑(s ∩ t) → f x₁ = f x₂ → x₁ = x₂)) =
    ↑(preimage s f hs ∩ preimage t f ht)
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝¹ : DecidableEq α
inst✝ : DecidableEq β
f : α → β
s t : Finset β
hst : InjOn f (f ⁻¹' ↑(s ∪ t))
⊢ ↑(preimage (s ∪ t) f hst) =
    ↑(preimage s f (_ : ∀ (x₁ : α), x₁ ∈ f ⁻¹' ↑s → ∀ (x₂ : α), x₂ ∈ f ⁻¹' ↑s → f x₁ = f x₂ → x₁ = x₂) ∪
        preimage t f (_ : ∀ (x₁ : α), x₁ ∈ f ⁻¹' ↑t → ∀ (x₂ : α), x₂ ∈ f ⁻¹' ↑t → f x₁ = f x₂ → x₁ = x₂))
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝³ : DecidableEq α
inst✝² : DecidableEq β
inst✝¹ : Fintype α
inst✝ : Fintype β
f : α → β
s : Finset β
hf : Injective f
⊢ ↑(preimage sᶜ f (_ : InjOn f (f ⁻¹' ↑sᶜ))) = ↑(preimage s f (_ : InjOn f (f ⁻¹' ↑s)))ᶜ
[PROOFSTEP]
simp
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝ : DecidableEq β
f : α → β
s : Finset α
t : Finset β
hf : InjOn f (f ⁻¹' ↑t)
⊢ (∀ (x : α), x ∈ s → f x ∈ t) ↔ s ⊆ preimage t f hf
[PROOFSTEP]
simp only [subset_iff, mem_preimage]
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
f : α ↪ β
s : Finset α
t : Finset β
⊢ map f s ⊆ t ↔ s ⊆ preimage t ↑f (_ : InjOn (↑f) (↑f ⁻¹' ↑t))
[PROOFSTEP]
classical rw [map_eq_image, image_subset_iff_subset_preimage]
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
f : α ↪ β
s : Finset α
t : Finset β
⊢ map f s ⊆ t ↔ s ⊆ preimage t ↑f (_ : InjOn (↑f) (↑f ⁻¹' ↑t))
[PROOFSTEP]
rw [map_eq_image, image_subset_iff_subset_preimage]
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝¹ : DecidableEq β
f : α → β
s : Finset β
inst✝ : (x : β) → Decidable (x ∈ Set.range f)
hf : InjOn f (f ⁻¹' ↑s)
⊢ ↑(image f (preimage s f hf)) = ↑(filter (fun x => x ∈ Set.range f) s)
[PROOFSTEP]
simp only [coe_image, coe_preimage, coe_filter, Set.image_preimage_eq_inter_range, ← Set.sep_mem_eq]
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝¹ : DecidableEq β
f : α → β
s : Finset β
inst✝ : (x : β) → Decidable (x ∈ Set.range f)
hf : InjOn f (f ⁻¹' ↑s)
⊢ {x | x ∈ ↑s ∧ x ∈ Set.range f} = {x | x ∈ s ∧ x ∈ Set.range f}
[PROOFSTEP]
rfl
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝ : DecidableEq β
f : α → β
s : Finset β
hf : BijOn f (f ⁻¹' ↑s) ↑s
⊢ ↑(image f (preimage s f (_ : InjOn f (f ⁻¹' ↑s)))) = ↑s
[PROOFSTEP]
simpa using hf.image_eq
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
f : α ↪ β
s : Finset β
t : Finset α
⊢ s ⊆ map f t ↔ ∃ u x, s = map f u
[PROOFSTEP]
classical
refine' ⟨fun h => ⟨_, preimage_subset h, _⟩, _⟩
· rw [map_eq_image, image_preimage, filter_true_of_mem]
  exact fun x hx ↦ coe_map_subset_range _ _ (h hx)
· rintro ⟨u, hut, rfl⟩
  exact map_subset_map.2 hut
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
f : α ↪ β
s : Finset β
t : Finset α
⊢ s ⊆ map f t ↔ ∃ u x, s = map f u
[PROOFSTEP]
refine' ⟨fun h => ⟨_, preimage_subset h, _⟩, _⟩
[GOAL]
case refine'_1
α : Type u
β : Type v
ι : Sort w
γ : Type x
f : α ↪ β
s : Finset β
t : Finset α
h : s ⊆ map f t
⊢ s = map f (preimage s ↑f (_ : InjOn (↑f) (↑f ⁻¹' ↑s)))
[PROOFSTEP]
rw [map_eq_image, image_preimage, filter_true_of_mem]
[GOAL]
case refine'_1
α : Type u
β : Type v
ι : Sort w
γ : Type x
f : α ↪ β
s : Finset β
t : Finset α
h : s ⊆ map f t
⊢ ∀ (x : β), x ∈ s → x ∈ Set.range ↑f
[PROOFSTEP]
exact fun x hx ↦ coe_map_subset_range _ _ (h hx)
[GOAL]
case refine'_2
α : Type u
β : Type v
ι : Sort w
γ : Type x
f : α ↪ β
s : Finset β
t : Finset α
⊢ (∃ u x, s = map f u) → s ⊆ map f t
[PROOFSTEP]
rintro ⟨u, hut, rfl⟩
[GOAL]
case refine'_2.intro.intro
α : Type u
β : Type v
ι : Sort w
γ : Type x
f : α ↪ β
t u : Finset α
hut : u ⊆ t
⊢ map f u ⊆ map f t
[PROOFSTEP]
exact map_subset_map.2 hut
[GOAL]
α : Type u
β✝ : Type v
ι : Sort w
γ : Type x
β : α → Type u_1
inst✝ : DecidableEq α
s : Finset ((a : α) × β a)
t : Finset α
⊢ (Finset.sigma t fun a => preimage s (Sigma.mk a) (_ : InjOn (Sigma.mk a) (Sigma.mk a ⁻¹' ↑s))) =
    filter (fun a => a.fst ∈ t) s
[PROOFSTEP]
ext x
[GOAL]
case a
α : Type u
β✝ : Type v
ι : Sort w
γ : Type x
β : α → Type u_1
inst✝ : DecidableEq α
s : Finset ((a : α) × β a)
t : Finset α
x : (i : α) × β i
⊢ (x ∈ Finset.sigma t fun a => preimage s (Sigma.mk a) (_ : InjOn (Sigma.mk a) (Sigma.mk a ⁻¹' ↑s))) ↔
    x ∈ filter (fun a => a.fst ∈ t) s
[PROOFSTEP]
simp [and_comm]
[GOAL]
α : Type u
β✝ : Type v
ι : Sort w
γ : Type x
β : α → Type u_1
inst✝ : DecidableEq α
s : Finset ((a : α) × β a)
t : Finset α
ht : image Sigma.fst s ⊆ t
⊢ (Finset.sigma t fun a => preimage s (Sigma.mk a) (_ : InjOn (Sigma.mk a) (Sigma.mk a ⁻¹' ↑s))) = s
[PROOFSTEP]
rw [sigma_preimage_mk, filter_true_of_mem <| image_subset_iff.1 ht]
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝¹ : CommMonoid β
f : α → γ
inst✝ : DecidablePred fun x => x ∈ Set.range f
s : Finset γ
hf : InjOn f (f ⁻¹' ↑s)
g : γ → β
⊢ ∏ x in preimage s f hf, g (f x) = ∏ x in filter (fun x => x ∈ Set.range f) s, g x
[PROOFSTEP]
haveI := Classical.decEq γ
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝¹ : CommMonoid β
f : α → γ
inst✝ : DecidablePred fun x => x ∈ Set.range f
s : Finset γ
hf : InjOn f (f ⁻¹' ↑s)
g : γ → β
this : DecidableEq γ
⊢ ∏ x in preimage s f hf, g (f x) = ∏ x in filter (fun x => x ∈ Set.range f) s, g x
[PROOFSTEP]
calc
  (∏ x in preimage s f hf, g (f x)) = ∏ x in image f (preimage s f hf), g x :=
    Eq.symm <| prod_image <| by simpa only [mem_preimage, InjOn] using hf
  _ = ∏ x in s.filter fun x => x ∈ Set.range f, g x := by rw [image_preimage]
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝¹ : CommMonoid β
f : α → γ
inst✝ : DecidablePred fun x => x ∈ Set.range f
s : Finset γ
hf : InjOn f (f ⁻¹' ↑s)
g : γ → β
this : DecidableEq γ
⊢ ∀ (x : α), x ∈ preimage s f hf → ∀ (y : α), y ∈ preimage s f hf → f x = f y → x = y
[PROOFSTEP]
simpa only [mem_preimage, InjOn] using hf
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝¹ : CommMonoid β
f : α → γ
inst✝ : DecidablePred fun x => x ∈ Set.range f
s : Finset γ
hf : InjOn f (f ⁻¹' ↑s)
g : γ → β
this : DecidableEq γ
⊢ ∏ x in image f (preimage s f hf), g x = ∏ x in filter (fun x => x ∈ Set.range f) s, g x
[PROOFSTEP]
rw [image_preimage]
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝ : CommMonoid β
f : α → γ
s : Finset γ
hf : InjOn f (f ⁻¹' ↑s)
g : γ → β
hg : ∀ (x : γ), x ∈ s → ¬x ∈ Set.range f → g x = 1
⊢ ∏ x in preimage s f hf, g (f x) = ∏ x in s, g x
[PROOFSTEP]
classical
rw [prod_preimage', prod_filter_of_ne]
exact fun x hx => Not.imp_symm (hg x hx)
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝ : CommMonoid β
f : α → γ
s : Finset γ
hf : InjOn f (f ⁻¹' ↑s)
g : γ → β
hg : ∀ (x : γ), x ∈ s → ¬x ∈ Set.range f → g x = 1
⊢ ∏ x in preimage s f hf, g (f x) = ∏ x in s, g x
[PROOFSTEP]
rw [prod_preimage', prod_filter_of_ne]
[GOAL]
α : Type u
β : Type v
ι : Sort w
γ : Type x
inst✝ : CommMonoid β
f : α → γ
s : Finset γ
hf : InjOn f (f ⁻¹' ↑s)
g : γ → β
hg : ∀ (x : γ), x ∈ s → ¬x ∈ Set.range f → g x = 1
⊢ ∀ (x : γ), x ∈ s → g x ≠ 1 → x ∈ Set.range f
[PROOFSTEP]
exact fun x hx => Not.imp_symm (hg x hx)