Theorem: List.prev_next
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.prev (l.next 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.prev (l.next (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.prev (l.next (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 + 1 + (l.length - 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 + 1 + (l.length - 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 + 1 + ([].length - 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 + 1 + ((hd :: tl).length - 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 + 1 + ([].length - 1)) % [].length) ⋯ = [].nthLe n hn
state_after: no goals

tactic: have : (n + 1 + length tl) % (length tl + 1) = n := by
  rw [length_cons] at hn
  rw [add_assoc, add_comm 1, 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 + 1 + ((hd :: tl).length - 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 + 1 + tl.length) % (tl.length + 1) = n
⊢ (hd :: tl).nthLe ((n + 1 + ((hd :: tl).length - 1)) % (hd :: tl).length) ⋯ = (hd :: tl).nthLe n hn

tactic: simp only [length_cons, Nat.succ_sub_succ_eq_sub, Nat.sub_zero, Nat.succ_eq_add_one, 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 + 1 + tl.length) % (tl.length + 1) = n
⊢ (hd :: tl).nthLe ((n + 1 + ((hd :: tl).length - 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 + 1 + tl.length) % (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 + 1 + tl.length) % (tl.length + 1) = n

tactic: rw [add_assoc, add_comm 1, 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 + 1 + tl.length) % (tl.length + 1) = n
state_after: no goals