Theorem: List.duplicate_iff_exists_distinct_get
File: Mathlib/Data/List/NodupEquivFin.lean

tactic: rw [duplicate_iff_two_le_count, le_count_iff_replicate_sublist,
  sublist_iff_exists_fin_orderEmbedding_get_eq]
state_before: α : Type u_1
l : List α
x : α
⊢ Duplicate x l ↔ ∃ n m, ∃ (_ : n < m), x = l.get n ∧ x = l.get m
state_after: α : Type u_1
l : List α
x : α
⊢ (∃ f, ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)) ↔
    ∃ n m, ∃ (_ : n < m), x = l.get n ∧ x = l.get m

tactic: constructor
state_before: α : Type u_1
l : List α
x : α
⊢ (∃ f, ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)) ↔
    ∃ n m, ∃ (_ : n < m), x = l.get n ∧ x = l.get m
state_after: case mp
α : Type u_1
l : List α
x : α
⊢ (∃ f, ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)) →
    ∃ n m, ∃ (_ : n < m), x = l.get n ∧ x = l.get m

case mpr
α : Type u_1
l : List α
x : α
⊢ (∃ n m, ∃ (_ : n < m), x = l.get n ∧ x = l.get m) →
    ∃ f, ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)

tactic: rintro ⟨f, hf⟩
state_before: case mp
α : Type u_1
l : List α
x : α
⊢ (∃ f, ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)) →
    ∃ n m, ∃ (_ : n < m), x = l.get n ∧ x = l.get m
state_after: case mp.intro
α : Type u_1
l : List α
x : α
f : Fin (replicate 2 x).length ↪o Fin l.length
hf : ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)
⊢ ∃ n m, ∃ (_ : n < m), x = l.get n ∧ x = l.get m

tactic: refine ⟨f ⟨0, by simp⟩, f ⟨1, by simp⟩, f.lt_iff_lt.2 (Nat.zero_lt_one), ?_⟩
state_before: case mp.intro
α : Type u_1
l : List α
x : α
f : Fin (replicate 2 x).length ↪o Fin l.length
hf : ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)
⊢ ∃ n m, ∃ (_ : n < m), x = l.get n ∧ x = l.get m
state_after: case mp.intro
α : Type u_1
l : List α
x : α
f : Fin (replicate 2 x).length ↪o Fin l.length
hf : ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)
⊢ x = l.get (f ⟨0, ⋯⟩) ∧ x = l.get (f ⟨1, ⋯⟩)

tactic: rw [← hf, ← hf]
state_before: case mp.intro
α : Type u_1
l : List α
x : α
f : Fin (replicate 2 x).length ↪o Fin l.length
hf : ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)
⊢ x = l.get (f ⟨0, ⋯⟩) ∧ x = l.get (f ⟨1, ⋯⟩)
state_after: case mp.intro
α : Type u_1
l : List α
x : α
f : Fin (replicate 2 x).length ↪o Fin l.length
hf : ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)
⊢ x = (replicate 2 x).get ⟨0, ⋯⟩ ∧ x = (replicate 2 x).get ⟨1, ⋯⟩

tactic: simp
state_before: case mp.intro
α : Type u_1
l : List α
x : α
f : Fin (replicate 2 x).length ↪o Fin l.length
hf : ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)
⊢ x = (replicate 2 x).get ⟨0, ⋯⟩ ∧ x = (replicate 2 x).get ⟨1, ⋯⟩
state_after: no goals

tactic: simp
state_before: α : Type u_1
l : List α
x : α
f : Fin (replicate 2 x).length ↪o Fin l.length
hf : ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)
⊢ 0 < (replicate 2 x).length
state_after: no goals

tactic: simp
state_before: α : Type u_1
l : List α
x : α
f : Fin (replicate 2 x).length ↪o Fin l.length
hf : ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)
⊢ 1 < (replicate 2 x).length
state_after: no goals

tactic: rintro ⟨n, m, hnm, h, h'⟩
state_before: case mpr
α : Type u_1
l : List α
x : α
⊢ (∃ n m, ∃ (_ : n < m), x = l.get n ∧ x = l.get m) →
    ∃ f, ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)
state_after: case mpr.intro.intro.intro.intro
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
⊢ ∃ f, ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)

tactic: refine ⟨OrderEmbedding.ofStrictMono (fun i => if (i : ℕ) = 0 then n else m) ?_, ?_⟩
state_before: case mpr.intro.intro.intro.intro
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
⊢ ∃ f, ∀ (ix : Fin (replicate 2 x).length), (replicate 2 x).get ix = l.get (f ix)
state_after: case mpr.intro.intro.intro.intro.refine_1
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
⊢ StrictMono fun i => if ↑i = 0 then n else m

case mpr.intro.intro.intro.intro.refine_2
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
⊢ ∀ (ix : Fin (replicate 2 x).length),
    (replicate 2 x).get ix =
      l.get ((OrderEmbedding.ofStrictMono (fun i => if ↑i = 0 then n else m) ?mpr.intro.intro.intro.intro.refine_1) ix)

tactic: rintro ⟨⟨_ | i⟩, hi⟩ ⟨⟨_ | j⟩, hj⟩
state_before: case mpr.intro.intro.intro.intro.refine_1
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
⊢ StrictMono fun i => if ↑i = 0 then n else m
state_after: case mpr.intro.intro.intro.intro.refine_1.mk.zero.mk.zero
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
hi hj : 0 < (replicate 2 x).length
⊢ ⟨0, hi⟩ < ⟨0, hj⟩ → (fun i => if ↑i = 0 then n else m) ⟨0, hi⟩ < (fun i => if ↑i = 0 then n else m) ⟨0, hj⟩

case mpr.intro.intro.intro.intro.refine_1.mk.zero.mk.succ
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
hi : 0 < (replicate 2 x).length
n✝ : ℕ
hj : n✝ + 1 < (replicate 2 x).length
⊢ ⟨0, hi⟩ < ⟨n✝ + 1, hj⟩ → (fun i => if ↑i = 0 then n else m) ⟨0, hi⟩ < (fun i => if ↑i = 0 then n else m) ⟨n✝ + 1, hj⟩

case mpr.intro.intro.intro.intro.refine_1.mk.succ.mk.zero
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
n✝ : ℕ
hi : n✝ + 1 < (replicate 2 x).length
hj : 0 < (replicate 2 x).length
⊢ ⟨n✝ + 1, hi⟩ < ⟨0, hj⟩ → (fun i => if ↑i = 0 then n else m) ⟨n✝ + 1, hi⟩ < (fun i => if ↑i = 0 then n else m) ⟨0, hj⟩

case mpr.intro.intro.intro.intro.refine_1.mk.succ.mk.succ
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
n✝¹ : ℕ
hi : n✝¹ + 1 < (replicate 2 x).length
n✝ : ℕ
hj : n✝ + 1 < (replicate 2 x).length
⊢ ⟨n✝¹ + 1, hi⟩ < ⟨n✝ + 1, hj⟩ →
    (fun i => if ↑i = 0 then n else m) ⟨n✝¹ + 1, hi⟩ < (fun i => if ↑i = 0 then n else m) ⟨n✝ + 1, hj⟩

tactic: simp
state_before: case mpr.intro.intro.intro.intro.refine_1.mk.zero.mk.zero
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
hi hj : 0 < (replicate 2 x).length
⊢ ⟨0, hi⟩ < ⟨0, hj⟩ → (fun i => if ↑i = 0 then n else m) ⟨0, hi⟩ < (fun i => if ↑i = 0 then n else m) ⟨0, hj⟩
state_after: no goals

tactic: simp [hnm]
state_before: case mpr.intro.intro.intro.intro.refine_1.mk.zero.mk.succ
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
hi : 0 < (replicate 2 x).length
n✝ : ℕ
hj : n✝ + 1 < (replicate 2 x).length
⊢ ⟨0, hi⟩ < ⟨n✝ + 1, hj⟩ → (fun i => if ↑i = 0 then n else m) ⟨0, hi⟩ < (fun i => if ↑i = 0 then n else m) ⟨n✝ + 1, hj⟩
state_after: no goals

tactic: simp
state_before: case mpr.intro.intro.intro.intro.refine_1.mk.succ.mk.zero
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
n✝ : ℕ
hi : n✝ + 1 < (replicate 2 x).length
hj : 0 < (replicate 2 x).length
⊢ ⟨n✝ + 1, hi⟩ < ⟨0, hj⟩ → (fun i => if ↑i = 0 then n else m) ⟨n✝ + 1, hi⟩ < (fun i => if ↑i = 0 then n else m) ⟨0, hj⟩
state_after: no goals

tactic: simp only [Nat.lt_succ_iff, Nat.succ_le_succ_iff, replicate, length, Nat.le_zero] at hi hj
state_before: case mpr.intro.intro.intro.intro.refine_1.mk.succ.mk.succ
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
n✝¹ : ℕ
hi : n✝¹ + 1 < (replicate 2 x).length
n✝ : ℕ
hj : n✝ + 1 < (replicate 2 x).length
⊢ ⟨n✝¹ + 1, hi⟩ < ⟨n✝ + 1, hj⟩ →
    (fun i => if ↑i = 0 then n else m) ⟨n✝¹ + 1, hi⟩ < (fun i => if ↑i = 0 then n else m) ⟨n✝ + 1, hj⟩
state_after: case mpr.intro.intro.intro.intro.refine_1.mk.succ.mk.succ
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
n✝¹ : ℕ
hi✝ : n✝¹ + 1 < (replicate 2 x).length
n✝ : ℕ
hj✝ : n✝ + 1 < (replicate 2 x).length
hi : n✝¹ = 0
hj : n✝ = 0
⊢ ⟨n✝¹ + 1, hi✝⟩ < ⟨n✝ + 1, hj✝⟩ →
    (fun i => if ↑i = 0 then n else m) ⟨n✝¹ + 1, hi✝⟩ < (fun i => if ↑i = 0 then n else m) ⟨n✝ + 1, hj✝⟩

tactic: simp [hi, hj]
state_before: case mpr.intro.intro.intro.intro.refine_1.mk.succ.mk.succ
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
n✝¹ : ℕ
hi✝ : n✝¹ + 1 < (replicate 2 x).length
n✝ : ℕ
hj✝ : n✝ + 1 < (replicate 2 x).length
hi : n✝¹ = 0
hj : n✝ = 0
⊢ ⟨n✝¹ + 1, hi✝⟩ < ⟨n✝ + 1, hj✝⟩ →
    (fun i => if ↑i = 0 then n else m) ⟨n✝¹ + 1, hi✝⟩ < (fun i => if ↑i = 0 then n else m) ⟨n✝ + 1, hj✝⟩
state_after: no goals

tactic: rintro ⟨⟨_ | i⟩, hi⟩
state_before: case mpr.intro.intro.intro.intro.refine_2
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
⊢ ∀ (ix : Fin (replicate 2 x).length),
    (replicate 2 x).get ix = l.get ((OrderEmbedding.ofStrictMono (fun i => if ↑i = 0 then n else m) ⋯) ix)
state_after: case mpr.intro.intro.intro.intro.refine_2.mk.zero
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
hi : 0 < (replicate 2 x).length
⊢ (replicate 2 x).get ⟨0, hi⟩ = l.get ((OrderEmbedding.ofStrictMono (fun i => if ↑i = 0 then n else m) ⋯) ⟨0, hi⟩)

case mpr.intro.intro.intro.intro.refine_2.mk.succ
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
n✝ : ℕ
hi : n✝ + 1 < (replicate 2 x).length
⊢ (replicate 2 x).get ⟨n✝ + 1, hi⟩ =
    l.get ((OrderEmbedding.ofStrictMono (fun i => if ↑i = 0 then n else m) ⋯) ⟨n✝ + 1, hi⟩)

tactic: simpa using h
state_before: case mpr.intro.intro.intro.intro.refine_2.mk.zero
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
hi : 0 < (replicate 2 x).length
⊢ (replicate 2 x).get ⟨0, hi⟩ = l.get ((OrderEmbedding.ofStrictMono (fun i => if ↑i = 0 then n else m) ⋯) ⟨0, hi⟩)
state_after: no goals

tactic: simpa using h'
state_before: case mpr.intro.intro.intro.intro.refine_2.mk.succ
α : Type u_1
l : List α
x : α
n m : Fin l.length
hnm : n < m
h : x = l.get n
h' : x = l.get m
n✝ : ℕ
hi : n✝ + 1 < (replicate 2 x).length
⊢ (replicate 2 x).get ⟨n✝ + 1, hi⟩ =
    l.get ((OrderEmbedding.ofStrictMono (fun i => if ↑i = 0 then n else m) ⋯) ⟨n✝ + 1, hi⟩)
state_after: no goals