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

Proof steps:
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: induction' l with hd tl IH generalizing l' f
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: 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)
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: 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 : ∃ (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: obtain ⟨w, h⟩ := this
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: 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
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 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'[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: simp only [get?_eq_getElem?] at hf IH
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: 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'
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: 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 <+ 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: apply List.Sublist.append _ (IH _ this)
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: 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]?
⊢ (take (f 0).succ l')[f 0] ∈ take (f 0 + 1) l'
state_after: no goals
tactic: apply List.get_mem