Theorem: Set.equitableOn_iff_exists_le_le_add_one
File: Mathlib/Data/Set/Equitable.lean

tactic: refine ⟨?_, fun ⟨b, hb⟩ x y hx hy => (hb x hx).2.trans (add_le_add_right (hb y hy).1 _)⟩
state_before: α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
⊢ s.EquitableOn f ↔ ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1
state_after: α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
⊢ s.EquitableOn f → ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1

tactic: obtain rfl | ⟨x, hx⟩ := s.eq_empty_or_nonempty
state_before: α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
⊢ s.EquitableOn f → ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1
state_after: case inl
α : Type u_1
β : Type u_2
f : α → ℕ
⊢ ∅.EquitableOn f → ∃ b, ∀ a ∈ ∅, b ≤ f a ∧ f a ≤ b + 1

case inr.intro
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
⊢ s.EquitableOn f → ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1

tactic: intro hs
state_before: case inr.intro
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
⊢ s.EquitableOn f → ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1
state_after: case inr.intro
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
⊢ ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1

tactic: by_cases h : ∀ y ∈ s, f x ≤ f y
state_before: case inr.intro
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
⊢ ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1
state_after: case pos
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
h : ∀ y ∈ s, f x ≤ f y
⊢ ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1

case neg
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
h : ¬∀ y ∈ s, f x ≤ f y
⊢ ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1

tactic: push_neg at h
state_before: case neg
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
h : ¬∀ y ∈ s, f x ≤ f y
⊢ ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1
state_after: case neg
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
h : ∃ y ∈ s, f y < f x
⊢ ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1

tactic: obtain ⟨w, hw, hwx⟩ := h
state_before: case neg
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
h : ∃ y ∈ s, f y < f x
⊢ ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1
state_after: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
w : α
hw : w ∈ s
hwx : f w < f x
⊢ ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1

tactic: refine ⟨f w, fun y hy => ⟨Nat.le_of_succ_le_succ ?_, hs hy hw⟩⟩
state_before: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
w : α
hw : w ∈ s
hwx : f w < f x
⊢ ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1
state_after: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
w : α
hw : w ∈ s
hwx : f w < f x
y : α
hy : y ∈ s
⊢ (f w).succ ≤ (f y).succ

tactic: rw [(Nat.succ_le_of_lt hwx).antisymm (hs hx hw)]
state_before: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
w : α
hw : w ∈ s
hwx : f w < f x
y : α
hy : y ∈ s
⊢ (f w).succ ≤ (f y).succ
state_after: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
w : α
hw : w ∈ s
hwx : f w < f x
y : α
hy : y ∈ s
⊢ f x ≤ (f y).succ

tactic: exact hs hx hy
state_before: case neg.intro.intro
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
w : α
hw : w ∈ s
hwx : f w < f x
y : α
hy : y ∈ s
⊢ f x ≤ (f y).succ
state_after: no goals

tactic: simp
state_before: case inl
α : Type u_1
β : Type u_2
f : α → ℕ
⊢ ∅.EquitableOn f → ∃ b, ∀ a ∈ ∅, b ≤ f a ∧ f a ≤ b + 1
state_after: no goals

tactic: exact ⟨f x, fun y hy => ⟨h _ hy, hs hy hx⟩⟩
state_before: case pos
α : Type u_1
β : Type u_2
s : Set α
f : α → ℕ
x : α
hx : x ∈ s
hs : s.EquitableOn f
h : ∀ y ∈ s, f x ≤ f y
⊢ ∃ b, ∀ a ∈ s, b ≤ f a ∧ f a ≤ b + 1
state_after: no goals