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

tactic: induction' l with hd tl hl
state_before: α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
h : l.Nodup
x : α
⊢ l ≠ [x] ↔ l = [] ∨ ∃ y ∈ l, y ≠ x
state_after: case nil
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x : α
h : [].Nodup
⊢ [] ≠ [x] ↔ [] = [] ∨ ∃ y ∈ [], y ≠ x

case cons
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
hl : tl.Nodup → (tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x)
h : (hd :: tl).Nodup
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x

tactic: simp
state_before: case nil
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x : α
h : [].Nodup
⊢ [] ≠ [x] ↔ [] = [] ∨ ∃ y ∈ [], y ≠ x
state_after: no goals

tactic: specialize hl h.of_cons
state_before: case cons
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
hl : tl.Nodup → (tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x)
h : (hd :: tl).Nodup
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x
state_after: case cons
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x

tactic: by_cases hx : tl = [x]
state_before: case cons
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x
state_after: case pos
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
hx : tl = [x]
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x

case neg
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
hx : ¬tl = [x]
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x

tactic: simpa [hx, and_comm, and_or_left] using h
state_before: case pos
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
hx : tl = [x]
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x
state_after: no goals

tactic: rw [← Ne, hl] at hx
state_before: case neg
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
hx : ¬tl = [x]
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x
state_after: case neg
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
hx : tl = [] ∨ ∃ y ∈ tl, y ≠ x
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x

tactic: rcases hx with (rfl | ⟨y, hy, hx⟩)
state_before: case neg
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
hx : tl = [] ∨ ∃ y ∈ tl, y ≠ x
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x
state_after: case neg.inl
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
h : [hd].Nodup
hl : [] ≠ [x] ↔ [] = [] ∨ ∃ y ∈ [], y ≠ x
⊢ [hd] ≠ [x] ↔ [hd] = [] ∨ ∃ y ∈ [hd], y ≠ x

case neg.inr.intro.intro
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
y : α
hy : y ∈ tl
hx : y ≠ x
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x

tactic: simp
state_before: case neg.inl
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
h : [hd].Nodup
hl : [] ≠ [x] ↔ [] = [] ∨ ∃ y ∈ [], y ≠ x
⊢ [hd] ≠ [x] ↔ [hd] = [] ∨ ∃ y ∈ [hd], y ≠ x
state_after: no goals

tactic: suffices ∃ y ∈ hd :: tl, y ≠ x by simpa [ne_nil_of_mem hy]
state_before: case neg.inr.intro.intro
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
y : α
hy : y ∈ tl
hx : y ≠ x
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x
state_after: case neg.inr.intro.intro
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
y : α
hy : y ∈ tl
hx : y ≠ x
⊢ ∃ y ∈ hd :: tl, y ≠ x

tactic: exact ⟨y, mem_cons_of_mem _ hy, hx⟩
state_before: case neg.inr.intro.intro
α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
y : α
hy : y ∈ tl
hx : y ≠ x
⊢ ∃ y ∈ hd :: tl, y ≠ x
state_after: no goals

tactic: simpa [ne_nil_of_mem hy]
state_before: α : Type u
β : Type v
l l₁ l₂ : List α
r : α → α → Prop
a b x hd : α
tl : List α
h : (hd :: tl).Nodup
hl : tl ≠ [x] ↔ tl = [] ∨ ∃ y ∈ tl, y ≠ x
y : α
hy : y ∈ tl
hx : y ≠ x
this : ∃ y ∈ hd :: tl, y ≠ x
⊢ hd :: tl ≠ [x] ↔ hd :: tl = [] ∨ ∃ y ∈ hd :: tl, y ≠ x
state_after: no goals