Theorem: Finset.induction_on_pi_of_choice
File: Mathlib/Data/Finset/PiInduction.lean

tactic: cases nonempty_fintype ι
state_before: ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
⊢ p f

tactic: induction' hs : univ.sigma f using Finset.strongInductionOn with s ihs generalizing f
state_before: case intro
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
⊢ p f

tactic: subst s
state_before: case intro.a
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs✝ : Finset.sigma univ f✝ = x✝
s : Finset ((i : ι) × α i)
ihs : ∀ (t : Finset ((i : ι) × α i)), t ⊂ s → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
f : (i : ι) → Finset (α i)
hs : Finset.sigma univ f = s
⊢ p f

tactic: cases' eq_empty_or_nonempty (univ.sigma f) with he hne
state_before: case intro.a
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ f → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
⊢ p f

tactic: convert h0 using 1
state_before: case intro.a.inl
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ f → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
he : Finset.sigma univ f = ∅
⊢ p f

tactic: simpa [funext_iff] using he
state_before: case h.e'_1
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ f → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
he : Finset.sigma univ f = ∅
⊢ f = fun x => ∅

tactic: rcases sigma_nonempty.1 hne with ⟨i, -, hi⟩
state_before: case intro.a.inr
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ f → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hne : Finset.Nonempty (Finset.sigma univ f)
⊢ p f

tactic: rcases H_ex i (f i) hi with ⟨x, x_mem, hr⟩
state_before: case intro.a.inr.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ f → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
⊢ p f

tactic: set g := update f i ((f i).erase x) with hg
state_before: case intro.a.inr.intro.intro.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ f → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
hr : r i x (erase (f i) x)
⊢ p f

tactic: have hx' : x ∉ g i := by
  rw [hg, update_same]
  apply not_mem_erase
state_before: case intro.a.inr.intro.intro.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ f → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
hr : r i x (erase (f i) x)
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
hg : g = update f i (erase (f i) x)
⊢ p f

tactic: rw [show f = update g i (insert x (g i)) by
  rw [hg, update_idem, update_same, insert_erase x_mem, update_eq_self]] at hr ihs ⊢
state_before: case intro.a.inr.intro.intro.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ f → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
hr : r i x (erase (f i) x)
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
hg : g = update f i (erase (f i) x)
hx' : ¬x ∈ g i
⊢ p f

tactic: clear hg
state_before: case intro.a.inr.intro.intro.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ (update g i (insert x (g i))) → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hr : r i x (erase (update g i (insert x (g i)) i) x)
hg : g = update f i (erase (f i) x)
hx' : ¬x ∈ g i
⊢ p (update g i (insert x (g i)))

tactic: rw [update_same, erase_insert hx'] at hr
state_before: case intro.a.inr.intro.intro.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ (update g i (insert x (g i))) → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hr : r i x (erase (update g i (insert x (g i)) i) x)
hx' : ¬x ∈ g i
⊢ p (update g i (insert x (g i)))

tactic: refine step _ _ _ hr (ihs (univ.sigma g) ?_ _ rfl)
state_before: case intro.a.inr.intro.intro.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ (update g i (insert x (g i))) → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hr : r i x (g i)
hx' : ¬x ∈ g i
⊢ p (update g i (insert x (g i)))

tactic: rw [ssubset_iff_of_subset (sigma_mono (Subset.refl _) _)]
state_before: case intro.a.inr.intro.intro.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ (update g i (insert x (g i))) → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hr : r i x (g i)
hx' : ¬x ∈ g i
⊢ Finset.sigma univ g ⊂ Finset.sigma univ (update g i (insert x (g i)))

tactic: exacts [⟨⟨i, x⟩, mem_sigma.2 ⟨mem_univ _, by simp⟩, by simp [hx']⟩,
  (@le_update_iff _ _ _ _ g g i _).2 ⟨subset_insert _ _, fun _ _ ↦ le_rfl⟩]
state_before: case intro.a.inr.intro.intro.intro.intro
ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ (update g i (insert x (g i))) → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hr : r i x (g i)
hx' : ¬x ∈ g i
⊢ ∃ x_1, x_1 ∈ Finset.sigma univ (update g i (insert x (g i))) ∧ ¬x_1 ∈ Finset.sigma univ g

ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ (update g i (insert x (g i))) → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hr : r i x (g i)
hx' : ¬x ∈ g i
⊢ ∀ (i_1 : ι), g i_1 ⊆ update g i (insert x (g i)) i_1

tactic: rw [hg, update_same]
state_before: ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ f → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
hr : r i x (erase (f i) x)
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
hg : g = update f i (erase (f i) x)
⊢ ¬x ∈ g i

tactic: apply not_mem_erase
state_before: ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ f → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
hr : r i x (erase (f i) x)
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
hg : g = update f i (erase (f i) x)
⊢ ¬x ∈ erase (f i) x

tactic: rw [hg, update_idem, update_same, insert_erase x_mem, update_eq_self]
state_before: ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ (update g i (insert x (g i))) → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hr : r i x (erase (update g i (insert x (g i)) i) x)
hg : g = update f i (erase (f i) x)
hx' : ¬x ∈ g i
⊢ f = update g i (insert x (g i))

tactic: simp
state_before: ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ (update g i (insert x (g i))) → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hr : r i x (g i)
hx' : ¬x ∈ g i
⊢ { fst := i, snd := x }.snd ∈ update g i (insert x (g i)) { fst := i, snd := x }.fst

tactic: simp [hx']
state_before: ι : Type u_2
α : ι → Type u_1
inst✝² : Finite ι
inst✝¹ : DecidableEq ι
inst✝ : (i : ι) → DecidableEq (α i)
r : (i : ι) → α i → Finset (α i) → Prop
H_ex : ∀ (i : ι) (s : Finset (α i)), Finset.Nonempty s → ∃ x, x ∈ s ∧ r i x (erase s x)
p : ((i : ι) → Finset (α i)) → Prop
f✝ : (i : ι) → Finset (α i)
h0 : p fun x => ∅
step : ∀ (g : (i : ι) → Finset (α i)) (i : ι) (x : α i), r i x (g i) → p g → p (update g i (insert x (g i)))
val✝ : Fintype ι
x✝ : Finset ((i : ι) × α i)
hs : Finset.sigma univ f✝ = x✝
f : (i : ι) → Finset (α i)
hne : Finset.Nonempty (Finset.sigma univ f)
i : ι
hi : Finset.Nonempty (f i)
x : α i
x_mem : x ∈ f i
g : (a : ι) → Finset (α a) := update f i (erase (f i) x)
ihs :
  ∀ (t : Finset ((i : ι) × α i)),
    t ⊂ Finset.sigma univ (update g i (insert x (g i))) → ∀ (f : (i : ι) → Finset (α i)), Finset.sigma univ f = t → p f
hr : r i x (g i)
hx' : ¬x ∈ g i
⊢ ¬{ fst := i, snd := x } ∈ Finset.sigma univ g