Theorem: List.nodup_iff_getElem?_ne_getElem?
File: Mathlib/Data/List/Nodup.lean

tactic: rw [Nodup, pairwise_iff_getElem]
state_before: α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
⊢ l.Nodup ↔ ∀ (i j : ℕ), i < j → j < l.length → l[i]? ≠ l[j]?
state_after: α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
⊢ (∀ (i j : ℕ) (_hi : i < l.length) (_hj : j < l.length), i < j → l[i] ≠ l[j]) ↔
    ∀ (i j : ℕ), i < j → j < l.length → l[i]? ≠ l[j]?

tactic: constructor
state_before: α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
⊢ (∀ (i j : ℕ) (_hi : i < l.length) (_hj : j < l.length), i < j → l[i] ≠ l[j]) ↔
    ∀ (i j : ℕ), i < j → j < l.length → l[i]? ≠ l[j]?
state_after: case mp
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
⊢ (∀ (i j : ℕ) (_hi : i < l.length) (_hj : j < l.length), i < j → l[i] ≠ l[j]) →
    ∀ (i j : ℕ), i < j → j < l.length → l[i]? ≠ l[j]?

case mpr
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
⊢ (∀ (i j : ℕ), i < j → j < l.length → l[i]? ≠ l[j]?) →
    ∀ (i j : ℕ) (_hi : i < l.length) (_hj : j < l.length), i < j → l[i] ≠ l[j]

tactic: intro h i j hij hj
state_before: case mp
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
⊢ (∀ (i j : ℕ) (_hi : i < l.length) (_hj : j < l.length), i < j → l[i] ≠ l[j]) →
    ∀ (i j : ℕ), i < j → j < l.length → l[i]? ≠ l[j]?
state_after: case mp
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
h : ∀ (i j : ℕ) (_hi : i < l.length) (_hj : j < l.length), i < j → l[i] ≠ l[j]
i j : ℕ
hij : i < j
hj : j < l.length
⊢ l[i]? ≠ l[j]?

tactic: rw [getElem?_eq_getElem (lt_trans hij hj), getElem?_eq_getElem hj, Ne, Option.some_inj]
state_before: case mp
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
h : ∀ (i j : ℕ) (_hi : i < l.length) (_hj : j < l.length), i < j → l[i] ≠ l[j]
i j : ℕ
hij : i < j
hj : j < l.length
⊢ l[i]? ≠ l[j]?
state_after: case mp
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
h : ∀ (i j : ℕ) (_hi : i < l.length) (_hj : j < l.length), i < j → l[i] ≠ l[j]
i j : ℕ
hij : i < j
hj : j < l.length
⊢ ¬l[i] = l[j]

tactic: exact h _ _ _ _ hij
state_before: case mp
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
h : ∀ (i j : ℕ) (_hi : i < l.length) (_hj : j < l.length), i < j → l[i] ≠ l[j]
i j : ℕ
hij : i < j
hj : j < l.length
⊢ ¬l[i] = l[j]
state_after: no goals

tactic: intro h i j hi hj hij
state_before: case mpr
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
⊢ (∀ (i j : ℕ), i < j → j < l.length → l[i]? ≠ l[j]?) →
    ∀ (i j : ℕ) (_hi : i < l.length) (_hj : j < l.length), i < j → l[i] ≠ l[j]
state_after: case mpr
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
h : ∀ (i j : ℕ), i < j → j < l.length → l[i]? ≠ l[j]?
i j : ℕ
hi : i < l.length
hj : j < l.length
hij : i < j
⊢ l[i] ≠ l[j]

tactic: rw [Ne, ← Option.some_inj, ← getElem?_eq_getElem, ← getElem?_eq_getElem]
state_before: case mpr
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
h : ∀ (i j : ℕ), i < j → j < l.length → l[i]? ≠ l[j]?
i j : ℕ
hi : i < l.length
hj : j < l.length
hij : i < j
⊢ l[i] ≠ l[j]
state_after: case mpr
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
h : ∀ (i j : ℕ), i < j → j < l.length → l[i]? ≠ l[j]?
i j : ℕ
hi : i < l.length
hj : j < l.length
hij : i < j
⊢ ¬l[i]? = l[j]?

tactic: exact h i j hij hj
state_before: case mpr
α : Type u
β : Type v
l✝ l₁ l₂ : List α
r : α → α → Prop
a b : α
l : List α
h : ∀ (i j : ℕ), i < j → j < l.length → l[i]? ≠ l[j]?
i j : ℕ
hi : i < l.length
hj : j < l.length
hij : i < j
⊢ ¬l[i]? = l[j]?
state_after: no goals