Theorem: Finset.induction_on_max_value
File: Mathlib/Data/Finset/Lattice.lean

tactic: induction' s using Finset.strongInductionOn with s ihs
state_before: F : Type ?u.399951
α : Type u_2
β : Type ?u.399957
γ : Type ?u.399960
ι : Type u_1
κ : Type ?u.399966
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
inst✝ : DecidableEq ι
f : ι → α
p : Finset ι → Prop
s : Finset ι
h0 : p ∅
step : ∀ (a : ι) (s : Finset ι), ¬a ∈ s → (∀ (x : ι), x ∈ s → f x ≤ f a) → p s → p (insert a s)
⊢ p s

tactic: rcases(s.image f).eq_empty_or_nonempty with (hne | hne)
state_before: case a
F : Type ?u.399951
α : Type u_2
β : Type ?u.399957
γ : Type ?u.399960
ι : Type u_1
κ : Type ?u.399966
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
inst✝ : DecidableEq ι
f : ι → α
p : Finset ι → Prop
h0 : p ∅
step : ∀ (a : ι) (s : Finset ι), ¬a ∈ s → (∀ (x : ι), x ∈ s → f x ≤ f a) → p s → p (insert a s)
s : Finset ι
ihs : ∀ (t : Finset ι), t ⊂ s → p t
⊢ p s

tactic: simp only [image_eq_empty] at hne
state_before: case a.inl
F : Type ?u.399951
α : Type u_2
β : Type ?u.399957
γ : Type ?u.399960
ι : Type u_1
κ : Type ?u.399966
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
inst✝ : DecidableEq ι
f : ι → α
p : Finset ι → Prop
h0 : p ∅
step : ∀ (a : ι) (s : Finset ι), ¬a ∈ s → (∀ (x : ι), x ∈ s → f x ≤ f a) → p s → p (insert a s)
s : Finset ι
ihs : ∀ (t : Finset ι), t ⊂ s → p t
hne : image f s = ∅
⊢ p s

tactic: simp only [hne, h0]
state_before: case a.inl
F : Type ?u.399951
α : Type u_2
β : Type ?u.399957
γ : Type ?u.399960
ι : Type u_1
κ : Type ?u.399966
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
inst✝ : DecidableEq ι
f : ι → α
p : Finset ι → Prop
h0 : p ∅
step : ∀ (a : ι) (s : Finset ι), ¬a ∈ s → (∀ (x : ι), x ∈ s → f x ≤ f a) → p s → p (insert a s)
s : Finset ι
ihs : ∀ (t : Finset ι), t ⊂ s → p t
hne : s = ∅
⊢ p s

tactic: have H : (s.image f).max' hne ∈ s.image f := max'_mem (s.image f) hne
state_before: case a.inr
F : Type ?u.399951
α : Type u_2
β : Type ?u.399957
γ : Type ?u.399960
ι : Type u_1
κ : Type ?u.399966
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
inst✝ : DecidableEq ι
f : ι → α
p : Finset ι → Prop
h0 : p ∅
step : ∀ (a : ι) (s : Finset ι), ¬a ∈ s → (∀ (x : ι), x ∈ s → f x ≤ f a) → p s → p (insert a s)
s : Finset ι
ihs : ∀ (t : Finset ι), t ⊂ s → p t
hne : Finset.Nonempty (image f s)
⊢ p s

tactic: simp only [mem_image, exists_prop] at H
state_before: case a.inr
F : Type ?u.399951
α : Type u_2
β : Type ?u.399957
γ : Type ?u.399960
ι : Type u_1
κ : Type ?u.399966
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
inst✝ : DecidableEq ι
f : ι → α
p : Finset ι → Prop
h0 : p ∅
step : ∀ (a : ι) (s : Finset ι), ¬a ∈ s → (∀ (x : ι), x ∈ s → f x ≤ f a) → p s → p (insert a s)
s : Finset ι
ihs : ∀ (t : Finset ι), t ⊂ s → p t
hne : Finset.Nonempty (image f s)
H : max' (image f s) hne ∈ image f s
⊢ p s

tactic: rcases H with ⟨a, has, hfa⟩
state_before: case a.inr
F : Type ?u.399951
α : Type u_2
β : Type ?u.399957
γ : Type ?u.399960
ι : Type u_1
κ : Type ?u.399966
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
inst✝ : DecidableEq ι
f : ι → α
p : Finset ι → Prop
h0 : p ∅
step : ∀ (a : ι) (s : Finset ι), ¬a ∈ s → (∀ (x : ι), x ∈ s → f x ≤ f a) → p s → p (insert a s)
s : Finset ι
ihs : ∀ (t : Finset ι), t ⊂ s → p t
hne : Finset.Nonempty (image f s)
H : ∃ a, a ∈ s ∧ f a = max' (image f s) hne
⊢ p s

tactic: rw [← insert_erase has]
state_before: case a.inr.intro.intro
F : Type ?u.399951
α : Type u_2
β : Type ?u.399957
γ : Type ?u.399960
ι : Type u_1
κ : Type ?u.399966
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
inst✝ : DecidableEq ι
f : ι → α
p : Finset ι → Prop
h0 : p ∅
step : ∀ (a : ι) (s : Finset ι), ¬a ∈ s → (∀ (x : ι), x ∈ s → f x ≤ f a) → p s → p (insert a s)
s : Finset ι
ihs : ∀ (t : Finset ι), t ⊂ s → p t
hne : Finset.Nonempty (image f s)
a : ι
has : a ∈ s
hfa : f a = max' (image f s) hne
⊢ p s

tactic: refine' step _ _ (not_mem_erase a s) (fun x hx => _) (ihs _ <| erase_ssubset has)
state_before: case a.inr.intro.intro
F : Type ?u.399951
α : Type u_2
β : Type ?u.399957
γ : Type ?u.399960
ι : Type u_1
κ : Type ?u.399966
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
inst✝ : DecidableEq ι
f : ι → α
p : Finset ι → Prop
h0 : p ∅
step : ∀ (a : ι) (s : Finset ι), ¬a ∈ s → (∀ (x : ι), x ∈ s → f x ≤ f a) → p s → p (insert a s)
s : Finset ι
ihs : ∀ (t : Finset ι), t ⊂ s → p t
hne : Finset.Nonempty (image f s)
a : ι
has : a ∈ s
hfa : f a = max' (image f s) hne
⊢ p (insert a (erase s a))

tactic: rw [hfa]
state_before: case a.inr.intro.intro
F : Type ?u.399951
α : Type u_2
β : Type ?u.399957
γ : Type ?u.399960
ι : Type u_1
κ : Type ?u.399966
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
inst✝ : DecidableEq ι
f : ι → α
p : Finset ι → Prop
h0 : p ∅
step : ∀ (a : ι) (s : Finset ι), ¬a ∈ s → (∀ (x : ι), x ∈ s → f x ≤ f a) → p s → p (insert a s)
s : Finset ι
ihs : ∀ (t : Finset ι), t ⊂ s → p t
hne : Finset.Nonempty (image f s)
a : ι
has : a ∈ s
hfa : f a = max' (image f s) hne
x : ι
hx : x ∈ erase s a
⊢ f x ≤ f a

tactic: exact le_max' _ _ (mem_image_of_mem _ <| mem_of_mem_erase hx)
state_before: case a.inr.intro.intro
F : Type ?u.399951
α : Type u_2
β : Type ?u.399957
γ : Type ?u.399960
ι : Type u_1
κ : Type ?u.399966
inst✝² : LinearOrder α
inst✝¹ : LinearOrder β
inst✝ : DecidableEq ι
f : ι → α
p : Finset ι → Prop
h0 : p ∅
step : ∀ (a : ι) (s : Finset ι), ¬a ∈ s → (∀ (x : ι), x ∈ s → f x ≤ f a) → p s → p (insert a s)
s : Finset ι
ihs : ∀ (t : Finset ι), t ⊂ s → p t
hne : Finset.Nonempty (image f s)
a : ι
has : a ∈ s
hfa : f a = max' (image f s) hne
x : ι
hx : x ∈ erase s a
⊢ f x ≤ max' (image f s) hne