Theorem: FinEnum.Finset.mem_enum
File: Mathlib/Data/FinEnum.lean

tactic: induction' xs with xs_hd generalizing s <;> simp [*, Finset.enum]
state_before: α : Type u
β : α → Type v
inst✝ : DecidableEq α
s : Finset α
xs : List α
⊢ s ∈ enum xs ↔ ∀ (x : α), x ∈ s → x ∈ xs

tactic: simp [Finset.eq_empty_iff_forall_not_mem]
state_before: case nil
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ s : Finset α
⊢ s = ∅ ↔ ∀ (x : α), x ∈ s → False

tactic: constructor
state_before: case cons
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
⊢ (∃ a, (∀ (x : α), x ∈ a → x ∈ tail✝) ∧ (s = a ∨ s = {xs_hd} ∪ a)) ↔ ∀ (x : α), x ∈ s → x = xs_hd ∨ x ∈ tail✝

tactic: rintro ⟨a, h, h'⟩ x hx
state_before: case cons.mp
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
⊢ (∃ a, (∀ (x : α), x ∈ a → x ∈ tail✝) ∧ (s = a ∨ s = {xs_hd} ∪ a)) → ∀ (x : α), x ∈ s → x = xs_hd ∨ x ∈ tail✝

tactic: cases' h' with _ h' a b
state_before: case cons.mp.intro.intro
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s a : Finset α
h : ∀ (x : α), x ∈ a → x ∈ tail✝
h' : s = a ∨ s = {xs_hd} ∪ a
x : α
hx : x ∈ s
⊢ x = xs_hd ∨ x ∈ tail✝

tactic: right
state_before: case cons.mp.intro.intro.inl
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s a : Finset α
h : ∀ (x : α), x ∈ a → x ∈ tail✝
x : α
hx : x ∈ s
h✝ : s = a
⊢ x = xs_hd ∨ x ∈ tail✝

tactic: apply h
state_before: case cons.mp.intro.intro.inl.h
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s a : Finset α
h : ∀ (x : α), x ∈ a → x ∈ tail✝
x : α
hx : x ∈ s
h✝ : s = a
⊢ x ∈ tail✝

tactic: subst a
state_before: case cons.mp.intro.intro.inl.h.a
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s a : Finset α
h : ∀ (x : α), x ∈ a → x ∈ tail✝
x : α
hx : x ∈ s
h✝ : s = a
⊢ x ∈ a

tactic: exact hx
state_before: case cons.mp.intro.intro.inl.h.a
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
x : α
hx : x ∈ s
h : ∀ (x : α), x ∈ s → x ∈ tail✝
⊢ x ∈ s

tactic: simp only [h', mem_union, mem_singleton] at hx⊢
state_before: case cons.mp.intro.intro.inr
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s a : Finset α
h : ∀ (x : α), x ∈ a → x ∈ tail✝
x : α
hx : x ∈ s
h' : s = {xs_hd} ∪ a
⊢ x = xs_hd ∨ x ∈ tail✝

tactic: cases' hx with hx hx'
state_before: case cons.mp.intro.intro.inr
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s a : Finset α
h : ∀ (x : α), x ∈ a → x ∈ tail✝
x : α
h' : s = {xs_hd} ∪ a
hx : x = xs_hd ∨ x ∈ a
⊢ x = xs_hd ∨ x ∈ tail✝

tactic: exact Or.inl hx
state_before: case cons.mp.intro.intro.inr.inl
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s a : Finset α
h : ∀ (x : α), x ∈ a → x ∈ tail✝
x : α
h' : s = {xs_hd} ∪ a
hx : x = xs_hd
⊢ x = xs_hd ∨ x ∈ tail✝

tactic: exact Or.inr (h _ hx')
state_before: case cons.mp.intro.intro.inr.inr
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s a : Finset α
h : ∀ (x : α), x ∈ a → x ∈ tail✝
x : α
h' : s = {xs_hd} ∪ a
hx' : x ∈ a
⊢ x = xs_hd ∨ x ∈ tail✝

tactic: intro h
state_before: case cons.mpr
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
⊢ (∀ (x : α), x ∈ s → x = xs_hd ∨ x ∈ tail✝) → ∃ a, (∀ (x : α), x ∈ a → x ∈ tail✝) ∧ (s = a ∨ s = {xs_hd} ∪ a)

tactic: exists s \ ({xs_hd} : Finset α)
state_before: case cons.mpr
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h : ∀ (x : α), x ∈ s → x = xs_hd ∨ x ∈ tail✝
⊢ ∃ a, (∀ (x : α), x ∈ a → x ∈ tail✝) ∧ (s = a ∨ s = {xs_hd} ∪ a)

tactic: simp only [and_imp, mem_sdiff, mem_singleton]
state_before: case cons.mpr
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h : ∀ (x : α), x ∈ s → x = xs_hd ∨ x ∈ tail✝
⊢ (∀ (x : α), x ∈ s \ {xs_hd} → x ∈ tail✝) ∧ (s = s \ {xs_hd} ∨ s = {xs_hd} ∪ s \ {xs_hd})

tactic: simp only [or_iff_not_imp_left] at h
state_before: case cons.mpr
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h : ∀ (x : α), x ∈ s → x = xs_hd ∨ x ∈ tail✝
⊢ (∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝) ∧ (s = s \ {xs_hd} ∨ s = {xs_hd} ∪ s \ {xs_hd})

tactic: exists h
state_before: case cons.mpr
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h : ∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝
⊢ (∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝) ∧ (s = s \ {xs_hd} ∨ s = {xs_hd} ∪ s \ {xs_hd})

tactic: by_cases h : xs_hd ∈ s
state_before: case cons.mpr
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h : ∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝
⊢ s = s \ {xs_hd} ∨ s = {xs_hd} ∪ s \ {xs_hd}

tactic: have : {xs_hd} ⊆ s
state_before: case pos
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h✝ : ∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝
h : xs_hd ∈ s
⊢ s = s \ {xs_hd} ∨ s = {xs_hd} ∪ s \ {xs_hd}

tactic: simp only [HasSubset.Subset, *, forall_eq, mem_singleton]
state_before: case this
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h✝ : ∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝
h : xs_hd ∈ s
⊢ {xs_hd} ⊆ s

case pos
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h✝ : ∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝
h : xs_hd ∈ s
this : {xs_hd} ⊆ s
⊢ s = s \ {xs_hd} ∨ s = {xs_hd} ∪ s \ {xs_hd}

tactic: simp only [union_sdiff_of_subset this, or_true_iff, Finset.union_sdiff_of_subset,
  eq_self_iff_true]
state_before: case pos
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h✝ : ∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝
h : xs_hd ∈ s
this : {xs_hd} ⊆ s
⊢ s = s \ {xs_hd} ∨ s = {xs_hd} ∪ s \ {xs_hd}

tactic: left
state_before: case neg
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h✝ : ∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝
h : ¬xs_hd ∈ s
⊢ s = s \ {xs_hd} ∨ s = {xs_hd} ∪ s \ {xs_hd}

tactic: symm
state_before: case neg.h
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h✝ : ∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝
h : ¬xs_hd ∈ s
⊢ s = s \ {xs_hd}

tactic: simp only [sdiff_eq_self]
state_before: case neg.h
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h✝ : ∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝
h : ¬xs_hd ∈ s
⊢ s \ {xs_hd} = s

tactic: intro a
state_before: case neg.h
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h✝ : ∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝
h : ¬xs_hd ∈ s
⊢ s ∩ {xs_hd} ⊆ ∅

tactic: simp only [and_imp, mem_inter, mem_singleton]
state_before: case neg.h
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h✝ : ∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝
h : ¬xs_hd ∈ s
a : α
⊢ a ∈ s ∩ {xs_hd} → a ∈ ∅

tactic: rintro h₀ rfl
state_before: case neg.h
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
xs_hd : α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
h✝ : ∀ (x : α), x ∈ s → ¬x = xs_hd → x ∈ tail✝
h : ¬xs_hd ∈ s
a : α
⊢ a ∈ s → a = xs_hd → a ∈ ∅

tactic: exact (h h₀).elim
state_before: case neg.h
α : Type u
β : α → Type v
inst✝ : DecidableEq α
s✝ : Finset α
tail✝ : List α
tail_ih✝ : ∀ (s : Finset α), s ∈ enum tail✝ ↔ ∀ (x : α), x ∈ s → x ∈ tail✝
s : Finset α
a : α
h₀ : a ∈ s
h✝ : ∀ (x : α), x ∈ s → ¬x = a → x ∈ tail✝
h : ¬a ∈ s
⊢ a ∈ ∅