Theorem: List.pairwise_iff_get
File: Mathlib/Data/List/Pairwise.lean

tactic: simp only [Pairwise.nil, true_iff_iff]
state_before: α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a : α
l : List α
⊢ Pairwise R [] ↔ ∀ (i j : Fin (length [])), i < j → R (get [] i) (get [] j)

tactic: exact fun i j _h => (Nat.not_lt_zero j).elim j.2
state_before: α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a : α
l : List α
⊢ ∀ (i j : Fin (length [])), i < j → R (get [] i) (get [] j)

tactic: rw [pairwise_cons, pairwise_iff_get]
state_before: α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
⊢ Pairwise R (a :: l) ↔ ∀ (i j : Fin (length (a :: l))), i < j → R (get (a :: l) i) (get (a :: l) j)

tactic: refine'
  ⟨fun H i j hij => _, fun H =>
    ⟨fun a' m => _, fun i j hij => _⟩⟩
state_before: α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
⊢ ((∀ (a' : α), a' ∈ l → R a a') ∧ ∀ (i j : Fin (length l)), i < j → R (get l i) (get l j)) ↔
    ∀ (i j : Fin (length (a :: l))), i < j → R (get (a :: l) i) (get (a :: l) j)

tactic: . simpa using H i.succ j.succ (show i.1.succ < j.1.succ from Nat.succ_lt_succ hij)
state_before: case refine'_3
α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
H : ∀ (i j : Fin (length (a :: l))), i < j → R (get (a :: l) i) (get (a :: l) j)
i j : Fin (length l)
hij : i < j
⊢ R (get l i) (get l j)

tactic: cases' j with j hj
state_before: case refine'_1
α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
H : (∀ (a' : α), a' ∈ l → R a a') ∧ ∀ (i j : Fin (length l)), i < j → R (get l i) (get l j)
i j : Fin (length (a :: l))
hij : i < j
⊢ R (get (a :: l) i) (get (a :: l) j)

tactic: cases' j with j
state_before: case refine'_1.mk
α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
H : (∀ (a' : α), a' ∈ l → R a a') ∧ ∀ (i j : Fin (length l)), i < j → R (get l i) (get l j)
i : Fin (length (a :: l))
j : ℕ
hj : j < length (a :: l)
hij : i < { val := j, isLt := hj }
⊢ R (get (a :: l) i) (get (a :: l) { val := j, isLt := hj })

tactic: cases' i with i hi
state_before: case refine'_1.mk.succ
α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
H : (∀ (a' : α), a' ∈ l → R a a') ∧ ∀ (i j : Fin (length l)), i < j → R (get l i) (get l j)
i : Fin (length (a :: l))
j : ℕ
hj : succ j < length (a :: l)
hij : i < { val := succ j, isLt := hj }
⊢ R (get (a :: l) i) (get (a :: l) { val := succ j, isLt := hj })

tactic: cases' i with i
state_before: case refine'_1.mk.succ.mk
α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
H : (∀ (a' : α), a' ∈ l → R a a') ∧ ∀ (i j : Fin (length l)), i < j → R (get l i) (get l j)
j : ℕ
hj : succ j < length (a :: l)
i : ℕ
hi : i < length (a :: l)
hij : { val := i, isLt := hi } < { val := succ j, isLt := hj }
⊢ R (get (a :: l) { val := i, isLt := hi }) (get (a :: l) { val := succ j, isLt := hj })

tactic: exact (Nat.not_lt_zero _).elim hij
state_before: case refine'_1.mk.zero
α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
H : (∀ (a' : α), a' ∈ l → R a a') ∧ ∀ (i j : Fin (length l)), i < j → R (get l i) (get l j)
i : Fin (length (a :: l))
hj : zero < length (a :: l)
hij : i < { val := zero, isLt := hj }
⊢ R (get (a :: l) i) (get (a :: l) { val := zero, isLt := hj })

tactic: exact H.1 _ (get_mem l _ _)
state_before: case refine'_1.mk.succ.mk.zero
α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
H : (∀ (a' : α), a' ∈ l → R a a') ∧ ∀ (i j : Fin (length l)), i < j → R (get l i) (get l j)
j : ℕ
hj : succ j < length (a :: l)
hi : zero < length (a :: l)
hij : { val := zero, isLt := hi } < { val := succ j, isLt := hj }
⊢ R (get (a :: l) { val := zero, isLt := hi }) (get (a :: l) { val := succ j, isLt := hj })

tactic: exact H.2 _ _ (Nat.lt_of_succ_lt_succ hij)
state_before: case refine'_1.mk.succ.mk.succ
α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
H : (∀ (a' : α), a' ∈ l → R a a') ∧ ∀ (i j : Fin (length l)), i < j → R (get l i) (get l j)
j : ℕ
hj : succ j < length (a :: l)
i : ℕ
hi : succ i < length (a :: l)
hij : { val := succ i, isLt := hi } < { val := succ j, isLt := hj }
⊢ R (get (a :: l) { val := succ i, isLt := hi }) (get (a :: l) { val := succ j, isLt := hj })

tactic: rcases get_of_mem m with ⟨n, h, rfl⟩
state_before: case refine'_2
α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
H : ∀ (i j : Fin (length (a :: l))), i < j → R (get (a :: l) i) (get (a :: l) j)
a' : α
m : a' ∈ l
⊢ R a a'

tactic: have := H ⟨0, show 0 < (a::l).length from Nat.succ_pos _⟩ ⟨n.succ, Nat.succ_lt_succ n.2⟩
  (Nat.succ_pos n)
state_before: case refine'_2.intro.refl
α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
H : ∀ (i j : Fin (length (a :: l))), i < j → R (get (a :: l) i) (get (a :: l) j)
n : Fin (length l)
m : get l n ∈ l
⊢ R a (get l n)

tactic: simpa
state_before: case refine'_2.intro.refl
α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
H : ∀ (i j : Fin (length (a :: l))), i < j → R (get (a :: l) i) (get (a :: l) j)
n : Fin (length l)
m : get l n ∈ l
this :
  R (get (a :: l) { val := 0, isLt := (_ : 0 < length (a :: l)) })
    (get (a :: l) { val := ↑(Fin.succ n), isLt := (_ : succ ↑n < succ (length l)) })
⊢ R a (get l n)

tactic: simpa using H i.succ j.succ (show i.1.succ < j.1.succ from Nat.succ_lt_succ hij)
state_before: case refine'_3
α : Type u_1
β : Type ?u.44959
R S T : α → α → Prop
a✝ : α
l✝ : List α
a : α
l : List α
H : ∀ (i j : Fin (length (a :: l))), i < j → R (get (a :: l) i) (get (a :: l) j)
i j : Fin (length l)
hij : i < j
⊢ R (get l i) (get l j)