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

tactic: obtain ⟨n, hn, rfl⟩ := nthLe_of_mem hx
state_before: α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ : α
l : List α
h : l.Nodup
x : α
hx : x ∈ l
⊢ l.next (l.prev x hx) ⋯ = x
state_after: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
n : ℕ
hn : n < l.length
hx : l.nthLe n hn ∈ l
⊢ l.next (l.prev (l.nthLe n hn) hx) ⋯ = l.nthLe n hn

tactic: simp only [next_nthLe, prev_nthLe, h, Nat.mod_add_mod]
state_before: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
n : ℕ
hn : n < l.length
hx : l.nthLe n hn ∈ l
⊢ l.next (l.prev (l.nthLe n hn) hx) ⋯ = l.nthLe n hn
state_after: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
n : ℕ
hn : n < l.length
hx : l.nthLe n hn ∈ l
⊢ l.nthLe ((n + (l.length - 1) + 1) % l.length) ⋯ = l.nthLe n hn

tactic: cases' l with hd tl
state_before: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
n : ℕ
hn : n < l.length
hx : l.nthLe n hn ∈ l
⊢ l.nthLe ((n + (l.length - 1) + 1) % l.length) ⋯ = l.nthLe n hn
state_after: case intro.intro.nil
α : Type u_1
inst✝ : DecidableEq α
l : List α
x : α
n : ℕ
h : [].Nodup
hn : n < [].length
hx : [].nthLe n hn ∈ []
⊢ [].nthLe ((n + ([].length - 1) + 1) % [].length) ⋯ = [].nthLe n hn

case intro.intro.cons
α : Type u_1
inst✝ : DecidableEq α
l : List α
x : α
n : ℕ
hd : α
tl : List α
h : (hd :: tl).Nodup
hn : n < (hd :: tl).length
hx : (hd :: tl).nthLe n hn ∈ hd :: tl
⊢ (hd :: tl).nthLe ((n + ((hd :: tl).length - 1) + 1) % (hd :: tl).length) ⋯ = (hd :: tl).nthLe n hn

tactic: simp at hx
state_before: case intro.intro.nil
α : Type u_1
inst✝ : DecidableEq α
l : List α
x : α
n : ℕ
h : [].Nodup
hn : n < [].length
hx : [].nthLe n hn ∈ []
⊢ [].nthLe ((n + ([].length - 1) + 1) % [].length) ⋯ = [].nthLe n hn
state_after: no goals

tactic: have : (n + length tl + 1) % (length tl + 1) = n := by
  rw [length_cons] at hn
  rw [add_assoc, Nat.add_mod_right, Nat.mod_eq_of_lt hn]
state_before: case intro.intro.cons
α : Type u_1
inst✝ : DecidableEq α
l : List α
x : α
n : ℕ
hd : α
tl : List α
h : (hd :: tl).Nodup
hn : n < (hd :: tl).length
hx : (hd :: tl).nthLe n hn ∈ hd :: tl
⊢ (hd :: tl).nthLe ((n + ((hd :: tl).length - 1) + 1) % (hd :: tl).length) ⋯ = (hd :: tl).nthLe n hn
state_after: case intro.intro.cons
α : Type u_1
inst✝ : DecidableEq α
l : List α
x : α
n : ℕ
hd : α
tl : List α
h : (hd :: tl).Nodup
hn : n < (hd :: tl).length
hx : (hd :: tl).nthLe n hn ∈ hd :: tl
this : (n + tl.length + 1) % (tl.length + 1) = n
⊢ (hd :: tl).nthLe ((n + ((hd :: tl).length - 1) + 1) % (hd :: tl).length) ⋯ = (hd :: tl).nthLe n hn

tactic: simp [this]
state_before: case intro.intro.cons
α : Type u_1
inst✝ : DecidableEq α
l : List α
x : α
n : ℕ
hd : α
tl : List α
h : (hd :: tl).Nodup
hn : n < (hd :: tl).length
hx : (hd :: tl).nthLe n hn ∈ hd :: tl
this : (n + tl.length + 1) % (tl.length + 1) = n
⊢ (hd :: tl).nthLe ((n + ((hd :: tl).length - 1) + 1) % (hd :: tl).length) ⋯ = (hd :: tl).nthLe n hn
state_after: no goals

tactic: rw [length_cons] at hn
state_before: α : Type u_1
inst✝ : DecidableEq α
l : List α
x : α
n : ℕ
hd : α
tl : List α
h : (hd :: tl).Nodup
hn : n < (hd :: tl).length
hx : (hd :: tl).nthLe n hn ∈ hd :: tl
⊢ (n + tl.length + 1) % (tl.length + 1) = n
state_after: α : Type u_1
inst✝ : DecidableEq α
l : List α
x : α
n : ℕ
hd : α
tl : List α
h : (hd :: tl).Nodup
hn✝ : n < (hd :: tl).length
hn : n < tl.length + 1
hx : (hd :: tl).nthLe n hn✝ ∈ hd :: tl
⊢ (n + tl.length + 1) % (tl.length + 1) = n

tactic: rw [add_assoc, Nat.add_mod_right, Nat.mod_eq_of_lt hn]
state_before: α : Type u_1
inst✝ : DecidableEq α
l : List α
x : α
n : ℕ
hd : α
tl : List α
h : (hd :: tl).Nodup
hn✝ : n < (hd :: tl).length
hn : n < tl.length + 1
hx : (hd :: tl).nthLe n hn✝ ∈ hd :: tl
⊢ (n + tl.length + 1) % (tl.length + 1) = n
state_after: no goals