Theorem: Finset.equitableOn_iff_le_le_add_one
File: Mathlib/Data/Set/Equitable.lean

Proof steps:
state_before: α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
⊢ (↑s).EquitableOn f ↔ ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
state_after: α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
⊢ (∃ b, ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1) ↔ ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
tactic: rw [Set.equitableOn_iff_exists_le_le_add_one]
state_before: α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
⊢ (∃ b, ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1) ↔ ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
state_after: α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
⊢ (∃ b, ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1) → ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
tactic: refine ⟨?_, fun h => ⟨_, h⟩⟩
state_before: α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
⊢ (∃ b, ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1) → ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
state_after: case intro
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
⊢ ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
tactic: rintro ⟨b, hb⟩
state_before: case intro
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
⊢ ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
state_after: case pos
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
h : ∀ a ∈ s, f a = b + 1
⊢ ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1

case neg
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
h : ¬∀ a ∈ s, f a = b + 1
⊢ ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
tactic: by_cases h : ∀ a ∈ s, f a = b + 1
state_before: case neg
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
h : ¬∀ a ∈ s, f a = b + 1
⊢ ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
state_after: case neg
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
h : ∃ a ∈ s, f a ≠ b + 1
⊢ ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
tactic: push_neg at h
state_before: case neg
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
h : ∃ a ∈ s, f a ≠ b + 1
⊢ ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
state_after: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
x : α
hx₁ : x ∈ s
hx₂ : f x ≠ b + 1
⊢ ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
tactic: obtain ⟨x, hx₁, hx₂⟩ := h
state_before: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
x : α
hx₁ : x ∈ s
hx₂ : f x ≠ b + 1
⊢ ∀ a ∈ s, (∑ i ∈ s, f i) / s.card ≤ f a ∧ f a ≤ (∑ i ∈ s, f i) / s.card + 1
state_after: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
x : α
hx₁ : x ∈ s
hx₂ : f x ≠ b + 1
⊢ b = (∑ i ∈ s, f i) / s.card
tactic: suffices h : b = (∑ i ∈ s, f i) / s.card by
    simp_rw [← h]
    apply hb
state_before: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
x : α
hx₁ : x ∈ s
hx₂ : f x ≠ b + 1
⊢ b = (∑ i ∈ s, f i) / s.card
state_after: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
x : α
hx₁ : x ∈ s
hx₂ : f x ≠ b + 1
⊢ (∑ i ∈ s, f i) / s.card = b
tactic: symm
state_before: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
x : α
hx₁ : x ∈ s
hx₂ : f x ≠ b + 1
⊢ (∑ i ∈ s, f i) / s.card = b
state_after: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
x : α
hx₁ : x ∈ s
hx₂ : f x ≠ b + 1
⊢ ∑ i ∈ s, (b + 1) ≤ (b + 1) * s.card
tactic: refine
    Nat.div_eq_of_lt_le (le_trans (by simp [mul_comm]) (sum_le_sum fun a ha => (hb a ha).1))
      ((sum_lt_sum (fun a ha => (hb a ha).2) ⟨_, hx₁, (hb _ hx₁).2.lt_of_ne hx₂⟩).trans_le ?_)
state_before: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
x : α
hx₁ : x ∈ s
hx₂ : f x ≠ b + 1
⊢ ∑ i ∈ s, (b + 1) ≤ (b + 1) * s.card
state_after: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
x : α
hx₁ : x ∈ s
hx₂ : f x ≠ b + 1
⊢ ∀ x ∈ s, b + 1 = b + 1
tactic: rw [mul_comm, sum_const_nat]
state_before: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Finset α
f : α → ℕ
a : α
b : ℕ
hb : ∀ a ∈ ↑s, b ≤ f a ∧ f a ≤ b + 1
x : α
hx₁ : x ∈ s
hx₂ : f x ≠ b + 1
⊢ ∀ x ∈ s, b + 1 = b + 1
state_after: no goals
tactic: exact fun _ _ => rfl