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

Proof steps:
state_before: α : Type u_1
inst✝ : DecidableEq α
l : List α
x : α
x✝ : [].Nodup
i : Fin [].length
⊢ [].next ([].get i) ⋯ = [].get ⟨(↑i + 1) % [].length, ⋯⟩
state_after: no goals
tactic: simpa using i.2
state_before: α : Type u_1
inst✝ : DecidableEq α
l : List α
x head✝ : α
x✝¹ : [head✝].Nodup
x✝ : Fin [head✝].length
⊢ [head✝].next ([head✝].get x✝) ⋯ = [head✝].get ⟨(↑x✝ + 1) % [head✝].length, ⋯⟩
state_after: no goals
tactic: simp
state_before: α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
_h : (x :: y :: l).Nodup
h0 : 0 < (x :: y :: l).length
⊢ (x :: y :: l).next ((x :: y :: l).get ⟨0, h0⟩) ⋯ = (x :: y :: l).get ⟨(↑⟨0, h0⟩ + 1) % (x :: y :: l).length, ⋯⟩
state_after: α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
_h : (x :: y :: l).Nodup
h0 : 0 < (x :: y :: l).length
h₁ : (x :: y :: l).get ⟨0, h0⟩ = x
⊢ (x :: y :: l).next ((x :: y :: l).get ⟨0, h0⟩) ⋯ = (x :: y :: l).get ⟨(↑⟨0, h0⟩ + 1) % (x :: y :: l).length, ⋯⟩
tactic: have h₁ : get (x :: y :: l) { val := 0, isLt := h0 } = x := by simp
state_before: α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
_h : (x :: y :: l).Nodup
h0 : 0 < (x :: y :: l).length
h₁ : (x :: y :: l).get ⟨0, h0⟩ = x
⊢ (x :: y :: l).next ((x :: y :: l).get ⟨0, h0⟩) ⋯ = (x :: y :: l).get ⟨(↑⟨0, h0⟩ + 1) % (x :: y :: l).length, ⋯⟩
state_after: α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
_h : (x :: y :: l).Nodup
h0 : 0 < (x :: y :: l).length
h₁ : (x :: y :: l).get ⟨0, h0⟩ = x
⊢ y = (x :: y :: l).get ⟨(↑⟨0, h0⟩ + 1) % (x :: y :: l).length, ⋯⟩
tactic: rw [next_cons_cons_eq' _ _ _ _ _ h₁]
state_before: α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
_h : (x :: y :: l).Nodup
h0 : 0 < (x :: y :: l).length
h₁ : (x :: y :: l).get ⟨0, h0⟩ = x
⊢ y = (x :: y :: l).get ⟨(↑⟨0, h0⟩ + 1) % (x :: y :: l).length, ⋯⟩
state_after: no goals
tactic: simp
state_before: α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hn : (x :: y :: l).Nodup
i : ℕ
hi : i + 1 < (x :: y :: l).length
⊢ (x :: y :: l).next ((x :: y :: l).get ⟨i + 1, hi⟩) ⋯ =
    (x :: y :: l).get ⟨(↑⟨i + 1, hi⟩ + 1) % (x :: y :: l).length, ⋯⟩
state_after: α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hn : (x :: y :: l).Nodup
i : ℕ
hi : i + 1 < (x :: y :: l).length
hx' : (x :: y :: l).get ⟨i + 1, hi⟩ ≠ x
⊢ (x :: y :: l).next ((x :: y :: l).get ⟨i + 1, hi⟩) ⋯ =
    (x :: y :: l).get ⟨(↑⟨i + 1, hi⟩ + 1) % (x :: y :: l).length, ⋯⟩
tactic: have hx' : (x :: y :: l).get ⟨i+1, hi⟩ ≠ x := by
      intro H
      suffices (i + 1 : ℕ) = 0 by simpa
      rw [nodup_iff_injective_get] at hn
      refine Fin.val_eq_of_eq (@hn ⟨i + 1, hi⟩ ⟨0, by simp⟩ ?_)
      simpa using H
state_before: α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hn : (x :: y :: l).Nodup
i : ℕ
hi : i + 1 < (x :: y :: l).length
hx' : (x :: y :: l).get ⟨i + 1, hi⟩ ≠ x
⊢ (x :: y :: l).next ((x :: y :: l).get ⟨i + 1, hi⟩) ⋯ =
    (x :: y :: l).get ⟨(↑⟨i + 1, hi⟩ + 1) % (x :: y :: l).length, ⋯⟩
state_after: α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hn : (x :: y :: l).Nodup
i : ℕ
hi : i + 1 < (x :: y :: l).length
hx' : (x :: y :: l).get ⟨i + 1, hi⟩ ≠ x
hi' : i ≤ l.length
⊢ (x :: y :: l).next ((x :: y :: l).get ⟨i + 1, hi⟩) ⋯ =
    (x :: y :: l).get ⟨(↑⟨i + 1, hi⟩ + 1) % (x :: y :: l).length, ⋯⟩
tactic: have hi' : i ≤ l.length := Nat.le_of_lt_succ (Nat.succ_lt_succ_iff.1 hi)
state_before: α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hn : (x :: y :: l).Nodup
i : ℕ
hi : i + 1 < (x :: y :: l).length
hx' : (x :: y :: l).get ⟨i + 1, hi⟩ ≠ x
hi' : i ≤ l.length
⊢ (x :: y :: l).next ((x :: y :: l).get ⟨i + 1, hi⟩) ⋯ =
    (x :: y :: l).get ⟨(↑⟨i + 1, hi⟩ + 1) % (x :: y :: l).length, ⋯⟩
state_after: case inl
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hn : (x :: y :: l).Nodup
i : ℕ
hi : i + 1 < (x :: y :: l).length
hx' : (x :: y :: l).get ⟨i + 1, hi⟩ ≠ x
hi'✝ : i ≤ l.length
hi' : i = l.length
⊢ (x :: y :: l).next ((x :: y :: l).get ⟨i + 1, hi⟩) ⋯ =
    (x :: y :: l).get ⟨(↑⟨i + 1, hi⟩ + 1) % (x :: y :: l).length, ⋯⟩

case inr
α : Type u_1
inst✝ : DecidableEq α
l✝ : List α
x✝ x y : α
l : List α
hn : (x :: y :: l).Nodup
i : ℕ
hi : i + 1 < (x :: y :: l).length
hx' : (x :: y :: l).get ⟨i + 1, hi⟩ ≠ x
hi'✝ : i ≤ l.length
hi' : i < l.length
⊢ (x :: y :: l).next ((x :: y :: l).get ⟨i + 1, hi⟩) ⋯ =
    (x :: y :: l).get ⟨(↑⟨i + 1, hi⟩ + 1) % (x :: y :: l).length, ⋯⟩
tactic: rcases hi'.eq_or_lt with (hi' | hi')