Theorem: List.nextOr_eq_nextOr_of_mem_of_ne
File: Mathlib/Data/List/Cycle.lean

tactic: induction' xs with y ys IH
state_before: α : Type u_1
inst✝ : DecidableEq α
xs : List α
x d d' : α
x_mem : x ∈ xs
x_ne : x ≠ xs.getLast ⋯
⊢ xs.nextOr x d = xs.nextOr x d'
state_after: case nil
α : Type u_1
inst✝ : DecidableEq α
x d d' : α
x_mem : x ∈ []
x_ne : x ≠ [].getLast ⋯
⊢ [].nextOr x d = [].nextOr x d'

case cons
α : Type u_1
inst✝ : DecidableEq α
x d d' y : α
ys : List α
IH : ∀ (x_mem : x ∈ ys), x ≠ ys.getLast ⋯ → ys.nextOr x d = ys.nextOr x d'
x_mem : x ∈ y :: ys
x_ne : x ≠ (y :: ys).getLast ⋯
⊢ (y :: ys).nextOr x d = (y :: ys).nextOr x d'

tactic: cases' ys with z zs
state_before: case cons
α : Type u_1
inst✝ : DecidableEq α
x d d' y : α
ys : List α
IH : ∀ (x_mem : x ∈ ys), x ≠ ys.getLast ⋯ → ys.nextOr x d = ys.nextOr x d'
x_mem : x ∈ y :: ys
x_ne : x ≠ (y :: ys).getLast ⋯
⊢ (y :: ys).nextOr x d = (y :: ys).nextOr x d'
state_after: case cons.nil
α : Type u_1
inst✝ : DecidableEq α
x d d' y : α
IH : ∀ (x_mem : x ∈ []), x ≠ [].getLast ⋯ → [].nextOr x d = [].nextOr x d'
x_mem : x ∈ [y]
x_ne : x ≠ [y].getLast ⋯
⊢ [y].nextOr x d = [y].nextOr x d'

case cons.cons
α : Type u_1
inst✝ : DecidableEq α
x d d' y z : α
zs : List α
IH : ∀ (x_mem : x ∈ z :: zs), x ≠ (z :: zs).getLast ⋯ → (z :: zs).nextOr x d = (z :: zs).nextOr x d'
x_mem : x ∈ y :: z :: zs
x_ne : x ≠ (y :: z :: zs).getLast ⋯
⊢ (y :: z :: zs).nextOr x d = (y :: z :: zs).nextOr x d'

tactic: by_cases h : x = y
state_before: case cons.cons
α : Type u_1
inst✝ : DecidableEq α
x d d' y z : α
zs : List α
IH : ∀ (x_mem : x ∈ z :: zs), x ≠ (z :: zs).getLast ⋯ → (z :: zs).nextOr x d = (z :: zs).nextOr x d'
x_mem : x ∈ y :: z :: zs
x_ne : x ≠ (y :: z :: zs).getLast ⋯
⊢ (y :: z :: zs).nextOr x d = (y :: z :: zs).nextOr x d'
state_after: case pos
α : Type u_1
inst✝ : DecidableEq α
x d d' y z : α
zs : List α
IH : ∀ (x_mem : x ∈ z :: zs), x ≠ (z :: zs).getLast ⋯ → (z :: zs).nextOr x d = (z :: zs).nextOr x d'
x_mem : x ∈ y :: z :: zs
x_ne : x ≠ (y :: z :: zs).getLast ⋯
h : x = y
⊢ (y :: z :: zs).nextOr x d = (y :: z :: zs).nextOr x d'

case neg
α : Type u_1
inst✝ : DecidableEq α
x d d' y z : α
zs : List α
IH : ∀ (x_mem : x ∈ z :: zs), x ≠ (z :: zs).getLast ⋯ → (z :: zs).nextOr x d = (z :: zs).nextOr x d'
x_mem : x ∈ y :: z :: zs
x_ne : x ≠ (y :: z :: zs).getLast ⋯
h : ¬x = y
⊢ (y :: z :: zs).nextOr x d = (y :: z :: zs).nextOr x d'

tactic: cases x_mem
state_before: case nil
α : Type u_1
inst✝ : DecidableEq α
x d d' : α
x_mem : x ∈ []
x_ne : x ≠ [].getLast ⋯
⊢ [].nextOr x d = [].nextOr x d'
state_after: no goals

tactic: simp at x_mem x_ne
state_before: case cons.nil
α : Type u_1
inst✝ : DecidableEq α
x d d' y : α
IH : ∀ (x_mem : x ∈ []), x ≠ [].getLast ⋯ → [].nextOr x d = [].nextOr x d'
x_mem : x ∈ [y]
x_ne : x ≠ [y].getLast ⋯
⊢ [y].nextOr x d = [y].nextOr x d'
state_after: case cons.nil
α : Type u_1
inst✝ : DecidableEq α
x d d' y : α
IH : ∀ (x_mem : x ∈ []), x ≠ [].getLast ⋯ → [].nextOr x d = [].nextOr x d'
x_ne : ¬x = y
x_mem : x = y
⊢ [y].nextOr x d = [y].nextOr x d'

tactic: contradiction
state_before: case cons.nil
α : Type u_1
inst✝ : DecidableEq α
x d d' y : α
IH : ∀ (x_mem : x ∈ []), x ≠ [].getLast ⋯ → [].nextOr x d = [].nextOr x d'
x_ne : ¬x = y
x_mem : x = y
⊢ [y].nextOr x d = [y].nextOr x d'
state_after: no goals

tactic: rw [h, nextOr_self_cons_cons, nextOr_self_cons_cons]
state_before: case pos
α : Type u_1
inst✝ : DecidableEq α
x d d' y z : α
zs : List α
IH : ∀ (x_mem : x ∈ z :: zs), x ≠ (z :: zs).getLast ⋯ → (z :: zs).nextOr x d = (z :: zs).nextOr x d'
x_mem : x ∈ y :: z :: zs
x_ne : x ≠ (y :: z :: zs).getLast ⋯
h : x = y
⊢ (y :: z :: zs).nextOr x d = (y :: z :: zs).nextOr x d'
state_after: no goals

tactic: rw [nextOr, nextOr, IH]
state_before: case neg
α : Type u_1
inst✝ : DecidableEq α
x d d' y z : α
zs : List α
IH : ∀ (x_mem : x ∈ z :: zs), x ≠ (z :: zs).getLast ⋯ → (z :: zs).nextOr x d = (z :: zs).nextOr x d'
x_mem : x ∈ y :: z :: zs
x_ne : x ≠ (y :: z :: zs).getLast ⋯
h : ¬x = y
⊢ (y :: z :: zs).nextOr x d = (y :: z :: zs).nextOr x d'
state_after: case neg.x_mem
α : Type u_1
inst✝ : DecidableEq α
x d d' y z : α
zs : List α
IH : ∀ (x_mem : x ∈ z :: zs), x ≠ (z :: zs).getLast ⋯ → (z :: zs).nextOr x d = (z :: zs).nextOr x d'
x_mem : x ∈ y :: z :: zs
x_ne : x ≠ (y :: z :: zs).getLast ⋯
h : ¬x = y
⊢ x ∈ z :: zs

case neg.x_ne
α : Type u_1
inst✝ : DecidableEq α
x d d' y z : α
zs : List α
IH : ∀ (x_mem : x ∈ z :: zs), x ≠ (z :: zs).getLast ⋯ → (z :: zs).nextOr x d = (z :: zs).nextOr x d'
x_mem : x ∈ y :: z :: zs
x_ne : x ≠ (y :: z :: zs).getLast ⋯
h : ¬x = y
⊢ x ≠ (z :: zs).getLast ⋯

tactic: simpa [h] using x_mem
state_before: case neg.x_mem
α : Type u_1
inst✝ : DecidableEq α
x d d' y z : α
zs : List α
IH : ∀ (x_mem : x ∈ z :: zs), x ≠ (z :: zs).getLast ⋯ → (z :: zs).nextOr x d = (z :: zs).nextOr x d'
x_mem : x ∈ y :: z :: zs
x_ne : x ≠ (y :: z :: zs).getLast ⋯
h : ¬x = y
⊢ x ∈ z :: zs
state_after: no goals

tactic: simpa using x_ne
state_before: case neg.x_ne
α : Type u_1
inst✝ : DecidableEq α
x d d' y z : α
zs : List α
IH : ∀ (x_mem : x ∈ z :: zs), x ≠ (z :: zs).getLast ⋯ → (z :: zs).nextOr x d = (z :: zs).nextOr x d'
x_mem : x ∈ y :: z :: zs
x_ne : x ≠ (y :: z :: zs).getLast ⋯
h : ¬x = y
⊢ x ≠ (z :: zs).getLast ⋯
state_after: no goals