Theorem: List.sublist_of_orderEmbedding_get?_eq
File: Mathlib/Data/List/NodupEquivFin.lean

tactic: induction' l with hd tl IH generalizing l' f
state_before: α : Type u_1
l l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), l.get? ix = l'.get? (f ix)
⊢ l <+ l'
state_after: case nil
α : Type u_1
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), [].get? ix = l'.get? (f ix)
⊢ [] <+ l'

case cons
α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
⊢ hd :: tl <+ l'

tactic: have : some hd = _ := hf 0
state_before: case cons
α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
⊢ hd :: tl <+ l'
state_after: case cons
α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
this : some hd = l'.get? (f 0)
⊢ hd :: tl <+ l'

tactic: rw [eq_comm, List.get?_eq_some] at this
state_before: case cons
α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
this : some hd = l'.get? (f 0)
⊢ hd :: tl <+ l'
state_after: case cons
α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
this : ∃ (h : f 0 < l'.length), l'.get ⟨f 0, h⟩ = hd
⊢ hd :: tl <+ l'

tactic: obtain ⟨w, h⟩ := this
state_before: case cons
α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
this : ∃ (h : f 0 < l'.length), l'.get ⟨f 0, h⟩ = hd
⊢ hd :: tl <+ l'
state_after: case cons.intro
α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'.get ⟨f 0, w⟩ = hd
⊢ hd :: tl <+ l'

tactic: let f' : ℕ ↪o ℕ :=
  OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) fun a b => by
    dsimp only
    rw [Nat.sub_le_sub_iff_right, OrderEmbedding.le_iff_le, Nat.succ_le_succ_iff]
    rw [Nat.succ_le_iff, OrderEmbedding.lt_iff_lt]
    exact b.succ_pos
state_before: case cons.intro
α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'.get ⟨f 0, w⟩ = hd
⊢ hd :: tl <+ l'
state_after: case cons.intro
α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'.get ⟨f 0, w⟩ = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
⊢ hd :: tl <+ l'

tactic: simp only [get_eq_getElem] at h
state_before: case cons.intro
α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'.get ⟨f 0, w⟩ = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
⊢ hd :: tl <+ l'
state_after: case cons.intro
α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
⊢ hd :: tl <+ l'

tactic: simp only [get?_eq_getElem?] at hf IH
state_before: case cons.intro
α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
⊢ hd :: tl <+ l'
state_after: case cons.intro
α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
⊢ hd :: tl <+ l'

tactic: have : ∀ ix, tl[ix]? = (l'.drop (f 0 + 1))[f' ix]? := by
  intro ix
  rw [List.getElem?_drop, OrderEmbedding.coe_ofMapLEIff, Nat.add_sub_cancel', ← hf]
  simp only [getElem?_cons_succ]
  rw [Nat.succ_le_iff, OrderEmbedding.lt_iff_lt]
  exact ix.succ_pos
state_before: case cons.intro
α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
⊢ hd :: tl <+ l'
state_after: case cons.intro
α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
this : ∀ (ix : ℕ), tl[ix]? = (drop (f 0 + 1) l')[f' ix]?
⊢ hd :: tl <+ l'

tactic: rw [← List.take_append_drop (f 0 + 1) l', ← List.singleton_append]
state_before: case cons.intro
α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
this : ∀ (ix : ℕ), tl[ix]? = (drop (f 0 + 1) l')[f' ix]?
⊢ hd :: tl <+ l'
state_after: case cons.intro
α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
this : ∀ (ix : ℕ), tl[ix]? = (drop (f 0 + 1) l')[f' ix]?
⊢ [hd] ++ tl <+ take (f 0 + 1) l' ++ drop (f 0 + 1) l'

tactic: apply List.Sublist.append _ (IH _ this)
state_before: case cons.intro
α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
this : ∀ (ix : ℕ), tl[ix]? = (drop (f 0 + 1) l')[f' ix]?
⊢ [hd] ++ tl <+ take (f 0 + 1) l' ++ drop (f 0 + 1) l'
state_after: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
this : ∀ (ix : ℕ), tl[ix]? = (drop (f 0 + 1) l')[f' ix]?
⊢ [hd] <+ take (f 0 + 1) l'

tactic: rw [List.singleton_sublist, ← h, l'.getElem_take _ (Nat.lt_succ_self _)]
state_before: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
this : ∀ (ix : ℕ), tl[ix]? = (drop (f 0 + 1) l')[f' ix]?
⊢ [hd] <+ take (f 0 + 1) l'
state_after: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
this : ∀ (ix : ℕ), tl[ix]? = (drop (f 0 + 1) l')[f' ix]?
⊢ (take (f 0).succ l')[f 0] ∈ take (f 0 + 1) l'

tactic: apply List.get_mem
state_before: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
this : ∀ (ix : ℕ), tl[ix]? = (drop (f 0 + 1) l')[f' ix]?
⊢ (take (f 0).succ l')[f 0] ∈ take (f 0 + 1) l'
state_after: no goals

tactic: simp
state_before: case nil
α : Type u_1
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), [].get? ix = l'.get? (f ix)
⊢ [] <+ l'
state_after: no goals

tactic: dsimp only
state_before: α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'.get ⟨f 0, w⟩ = hd
a b : ℕ
⊢ (fun i => f (i + 1) - (f 0 + 1)) a ≤ (fun i => f (i + 1) - (f 0 + 1)) b ↔ a ≤ b
state_after: α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'.get ⟨f 0, w⟩ = hd
a b : ℕ
⊢ f (a + 1) - (f 0 + 1) ≤ f (b + 1) - (f 0 + 1) ↔ a ≤ b

tactic: rw [Nat.sub_le_sub_iff_right, OrderEmbedding.le_iff_le, Nat.succ_le_succ_iff]
state_before: α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'.get ⟨f 0, w⟩ = hd
a b : ℕ
⊢ f (a + 1) - (f 0 + 1) ≤ f (b + 1) - (f 0 + 1) ↔ a ≤ b
state_after: α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'.get ⟨f 0, w⟩ = hd
a b : ℕ
⊢ f 0 + 1 ≤ f (b + 1)

tactic: rw [Nat.succ_le_iff, OrderEmbedding.lt_iff_lt]
state_before: α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'.get ⟨f 0, w⟩ = hd
a b : ℕ
⊢ f 0 + 1 ≤ f (b + 1)
state_after: α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'.get ⟨f 0, w⟩ = hd
a b : ℕ
⊢ 0 < b + 1

tactic: exact b.succ_pos
state_before: α : Type u_1
hd : α
tl : List α
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl.get? ix = l'.get? (f ix)) → tl <+ l'
l' : List α
f : ℕ ↪o ℕ
hf : ∀ (ix : ℕ), (hd :: tl).get? ix = l'.get? (f ix)
w : f 0 < l'.length
h : l'.get ⟨f 0, w⟩ = hd
a b : ℕ
⊢ 0 < b + 1
state_after: no goals

tactic: intro ix
state_before: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
⊢ ∀ (ix : ℕ), tl[ix]? = (drop (f 0 + 1) l')[f' ix]?
state_after: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
ix : ℕ
⊢ tl[ix]? = (drop (f 0 + 1) l')[f' ix]?

tactic: rw [List.getElem?_drop, OrderEmbedding.coe_ofMapLEIff, Nat.add_sub_cancel', ← hf]
state_before: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
ix : ℕ
⊢ tl[ix]? = (drop (f 0 + 1) l')[f' ix]?
state_after: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
ix : ℕ
⊢ tl[ix]? = (hd :: tl)[ix + 1]?

α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
ix : ℕ
⊢ f 0 + 1 ≤ f (ix + 1)

tactic: simp only [getElem?_cons_succ]
state_before: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
ix : ℕ
⊢ tl[ix]? = (hd :: tl)[ix + 1]?

α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
ix : ℕ
⊢ f 0 + 1 ≤ f (ix + 1)
state_after: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
ix : ℕ
⊢ f 0 + 1 ≤ f (ix + 1)

tactic: rw [Nat.succ_le_iff, OrderEmbedding.lt_iff_lt]
state_before: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
ix : ℕ
⊢ f 0 + 1 ≤ f (ix + 1)
state_after: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
ix : ℕ
⊢ 0 < ix + 1

tactic: exact ix.succ_pos
state_before: α : Type u_1
hd : α
tl l' : List α
f : ℕ ↪o ℕ
w : f 0 < l'.length
h : l'[f 0] = hd
f' : ℕ ↪o ℕ := OrderEmbedding.ofMapLEIff (fun i => f (i + 1) - (f 0 + 1)) ⋯
hf : ∀ (ix : ℕ), (hd :: tl)[ix]? = l'[f ix]?
IH : ∀ {l' : List α} (f : ℕ ↪o ℕ), (∀ (ix : ℕ), tl[ix]? = l'[f ix]?) → tl <+ l'
ix : ℕ
⊢ 0 < ix + 1
state_after: no goals