Theorem: List.Nodup.erase_eq_filter
File: Mathlib/Data/List/Nodup.lean

tactic: induction' d with b l m _ IH
state_before: α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a✝ b : α
inst✝ : DecidableEq α
l : List α
d : l.Nodup
a : α
⊢ l.erase a = List.filter (fun x => decide (x ≠ a)) l
state_after: case nil
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a✝ b : α
inst✝ : DecidableEq α
l : List α
a : α
⊢ [].erase a = List.filter (fun x => decide (x ≠ a)) []

case cons
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a✝¹ b✝ : α
inst✝ : DecidableEq α
l✝ : List α
a b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase a = List.filter (fun x => decide (x ≠ a)) l
⊢ (b :: l).erase a = List.filter (fun x => decide (x ≠ a)) (b :: l)

tactic: by_cases h : b = a
state_before: case cons
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a✝¹ b✝ : α
inst✝ : DecidableEq α
l✝ : List α
a b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase a = List.filter (fun x => decide (x ≠ a)) l
⊢ (b :: l).erase a = List.filter (fun x => decide (x ≠ a)) (b :: l)
state_after: case pos
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a✝¹ b✝ : α
inst✝ : DecidableEq α
l✝ : List α
a b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase a = List.filter (fun x => decide (x ≠ a)) l
h : b = a
⊢ (b :: l).erase a = List.filter (fun x => decide (x ≠ a)) (b :: l)

case neg
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a✝¹ b✝ : α
inst✝ : DecidableEq α
l✝ : List α
a b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase a = List.filter (fun x => decide (x ≠ a)) l
h : ¬b = a
⊢ (b :: l).erase a = List.filter (fun x => decide (x ≠ a)) (b :: l)

tactic: rfl
state_before: case nil
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a✝ b : α
inst✝ : DecidableEq α
l : List α
a : α
⊢ [].erase a = List.filter (fun x => decide (x ≠ a)) []
state_after: no goals

tactic: subst h
state_before: case pos
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a✝¹ b✝ : α
inst✝ : DecidableEq α
l✝ : List α
a b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase a = List.filter (fun x => decide (x ≠ a)) l
h : b = a
⊢ (b :: l).erase a = List.filter (fun x => decide (x ≠ a)) (b :: l)
state_after: case pos
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a b✝ : α
inst✝ : DecidableEq α
l✝ : List α
b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase b = List.filter (fun x => decide (x ≠ b)) l
⊢ (b :: l).erase b = List.filter (fun x => decide (x ≠ b)) (b :: l)

tactic: rw [erase_cons_head, filter_cons_of_neg _ (by simp)]
state_before: case pos
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a b✝ : α
inst✝ : DecidableEq α
l✝ : List α
b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase b = List.filter (fun x => decide (x ≠ b)) l
⊢ (b :: l).erase b = List.filter (fun x => decide (x ≠ b)) (b :: l)
state_after: case pos
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a b✝ : α
inst✝ : DecidableEq α
l✝ : List α
b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase b = List.filter (fun x => decide (x ≠ b)) l
⊢ l = List.filter (fun x => decide (x ≠ b)) l

tactic: symm
state_before: case pos
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a b✝ : α
inst✝ : DecidableEq α
l✝ : List α
b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase b = List.filter (fun x => decide (x ≠ b)) l
⊢ l = List.filter (fun x => decide (x ≠ b)) l
state_after: case pos
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a b✝ : α
inst✝ : DecidableEq α
l✝ : List α
b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase b = List.filter (fun x => decide (x ≠ b)) l
⊢ List.filter (fun x => decide (x ≠ b)) l = l

tactic: rw [filter_eq_self]
state_before: case pos
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a b✝ : α
inst✝ : DecidableEq α
l✝ : List α
b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase b = List.filter (fun x => decide (x ≠ b)) l
⊢ List.filter (fun x => decide (x ≠ b)) l = l
state_after: case pos
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a b✝ : α
inst✝ : DecidableEq α
l✝ : List α
b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase b = List.filter (fun x => decide (x ≠ b)) l
⊢ ∀ a ∈ l, decide (a ≠ b) = true

tactic: simpa [@eq_comm α] using m
state_before: case pos
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a b✝ : α
inst✝ : DecidableEq α
l✝ : List α
b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase b = List.filter (fun x => decide (x ≠ b)) l
⊢ ∀ a ∈ l, decide (a ≠ b) = true
state_after: no goals

tactic: simp
state_before: α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a b✝ : α
inst✝ : DecidableEq α
l✝ : List α
b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase b = List.filter (fun x => decide (x ≠ b)) l
⊢ ¬decide (b ≠ b) = true
state_after: no goals

tactic: rw [erase_cons_tail _ (not_beq_of_ne h), filter_cons_of_pos, IH]
state_before: case neg
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a✝¹ b✝ : α
inst✝ : DecidableEq α
l✝ : List α
a b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase a = List.filter (fun x => decide (x ≠ a)) l
h : ¬b = a
⊢ (b :: l).erase a = List.filter (fun x => decide (x ≠ a)) (b :: l)
state_after: case neg.pa
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a✝¹ b✝ : α
inst✝ : DecidableEq α
l✝ : List α
a b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase a = List.filter (fun x => decide (x ≠ a)) l
h : ¬b = a
⊢ decide (b ≠ a) = true

tactic: simp [h]
state_before: case neg.pa
α : Type u
β : Type v
l✝¹ l₁ l₂ : List α
r : α → α → Prop
a✝¹ b✝ : α
inst✝ : DecidableEq α
l✝ : List α
a b : α
l : List α
m : ∀ a' ∈ l, b ≠ a'
a✝ : Pairwise (fun x x_1 => x ≠ x_1) l
IH : l.erase a = List.filter (fun x => decide (x ≠ a)) l
h : ¬b = a
⊢ decide (b ≠ a) = true
state_after: no goals