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

Proof steps:
state_before: α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ : α
l : List α
h : l.Nodup
x : α
hx : x ∈ l
⊢ l.reverse.prev x ⋯ = l.next x hx
state_after: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
k : ℕ
hk : k < l.length
hx : l.nthLe k hk ∈ l
⊢ l.reverse.prev (l.nthLe k hk) ⋯ = l.next (l.nthLe k hk) hx
tactic: obtain ⟨k, hk, rfl⟩ := nthLe_of_mem hx
state_before: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
k : ℕ
hk : k < l.length
hx : l.nthLe k hk ∈ l
⊢ l.reverse.prev (l.nthLe k hk) ⋯ = l.next (l.nthLe k hk) hx
state_after: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
k : ℕ
hk : k < l.length
hx : l.nthLe k hk ∈ l
lpos : 0 < l.length
⊢ l.reverse.prev (l.nthLe k hk) ⋯ = l.next (l.nthLe k hk) hx
tactic: have lpos : 0 < l.length := k.zero_le.trans_lt hk
state_before: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
k : ℕ
hk : k < l.length
hx : l.nthLe k hk ∈ l
lpos : 0 < l.length
⊢ l.reverse.prev (l.nthLe k hk) ⋯ = l.next (l.nthLe k hk) hx
state_after: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
k : ℕ
hk : k < l.length
hx : l.nthLe k hk ∈ l
lpos : 0 < l.length
key : l.length - 1 - k < l.length
⊢ l.reverse.prev (l.nthLe k hk) ⋯ = l.next (l.nthLe k hk) hx
tactic: have key : l.length - 1 - k < l.length := by omega
state_before: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
k : ℕ
hk : k < l.length
hx : l.nthLe k hk ∈ l
lpos : 0 < l.length
key : l.length - 1 - k < l.length
⊢ l.reverse.prev (l.nthLe k hk) ⋯ = l.next (l.nthLe k hk) hx
state_after: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
k : ℕ
hk : k < l.length
hx : l.nthLe k hk ∈ l
lpos : 0 < l.length
key : l.length - 1 - k < l.length
⊢ l.reverse.prev (l.nthLe k hk) ⋯ = (pmap l.next l ⋯).nthLe k ⋯
tactic: rw [← nthLe_pmap l.next (fun _ h => h) (by simpa using hk)]
state_before: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
k : ℕ
hk : k < l.length
hx : l.nthLe k hk ∈ l
lpos : 0 < l.length
key : l.length - 1 - k < l.length
⊢ l.reverse.prev (l.nthLe k hk) ⋯ = (pmap l.next l ⋯).nthLe k ⋯
state_after: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
k : ℕ
hk : k < l.length
hx : l.nthLe k hk ∈ l
lpos : 0 < l.length
key : l.length - 1 - k < l.length
⊢ l.reverse.prev (l.reverse.nthLe (l.length - 1 - k) ⋯) ⋯ = (l.rotate 1).nthLe k ⋯
tactic: simp_rw [← nthLe_reverse l k (key.trans_le (by simp)), pmap_next_eq_rotate_one _ h]
state_before: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
k : ℕ
hk : k < l.length
hx : l.nthLe k hk ∈ l
lpos : 0 < l.length
key : l.length - 1 - k < l.length
⊢ l.reverse.prev (l.reverse.nthLe (l.length - 1 - k) ⋯) ⋯ = (l.rotate 1).nthLe k ⋯
state_after: case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
k : ℕ
hk : k < l.length
hx : l.nthLe k hk ∈ l
lpos : 0 < l.length
key : l.length - 1 - k < l.length
⊢ (pmap l.reverse.prev l.reverse ⋯).nthLe (l.length - 1 - k) ?intro.intro = (l.rotate 1).nthLe k ⋯

case intro.intro
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x : α
l : List α
h : l.Nodup
k : ℕ
hk : k < l.length
hx : l.nthLe k hk ∈ l
lpos : 0 < l.length
key : l.length - 1 - k < l.length
⊢ l.length - 1 - k < (pmap l.reverse.prev l.reverse ⋯).length
tactic: rw [← nthLe_pmap l.reverse.prev fun _ h => h]