Theorem: Stream'.WSeq.exists_dropn_of_mem
File: Mathlib/Data/Seq/WSeq.lean

Proof steps:
state_before: α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
state_after: case mk.intro
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
o : Option (α × WSeq α)
om : o ∈ (s.drop n).destruct
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
tactic: rcases (head_terminates_iff _).1 ⟨⟨_, h⟩⟩ with ⟨⟨o, om⟩⟩
state_before: case mk.intro
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
o : Option (α × WSeq α)
om : o ∈ (s.drop n).destruct
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
state_after: case mk.intro
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
o : Option (α × WSeq α)
om : o ∈ (s.drop n).destruct
this : Prod.fst <$> o = some a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
tactic: have := Computation.mem_unique (Computation.mem_map _ om) h
state_before: case mk.intro
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
o : Option (α × WSeq α)
om : o ∈ (s.drop n).destruct
this : Prod.fst <$> o = some a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
state_after: case mk.intro.none
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
om : none ∈ (s.drop n).destruct
this : Prod.fst <$> none = some a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct

case mk.intro.some
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
o : α × WSeq α
om : some o ∈ (s.drop n).destruct
this : Prod.fst <$> some o = some a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
tactic: cases' o with o
state_before: case mk.intro.some
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
o : α × WSeq α
om : some o ∈ (s.drop n).destruct
this : Prod.fst <$> some o = some a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
state_after: case mk.intro.some
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
o : α × WSeq α
om : some o ∈ (s.drop n).destruct
i : o.1 = a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
tactic: injection this with i
state_before: case mk.intro.some
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
o : α × WSeq α
om : some o ∈ (s.drop n).destruct
i : o.1 = a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
state_after: case mk.intro.some.mk
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
a' : α
s' : WSeq α
om : some (a', s') ∈ (s.drop n).destruct
i : (a', s').1 = a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
tactic: cases' o with a' s'
state_before: case mk.intro.some.mk
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
a' : α
s' : WSeq α
om : some (a', s') ∈ (s.drop n).destruct
i : (a', s').1 = a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
state_after: case mk.intro.some.mk
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
a' : α
s' : WSeq α
om : some (a', s') ∈ (s.drop n).destruct
i : a' = a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
tactic: dsimp at i
state_before: case mk.intro.some.mk
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
a' : α
s' : WSeq α
om : some (a', s') ∈ (s.drop n).destruct
i : a' = a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
state_after: case mk.intro.some.mk
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
a' : α
s' : WSeq α
om : some (a, s') ∈ (s.drop n).destruct
i : a' = a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
tactic: rw [i] at om
state_before: case mk.intro.some.mk
α : Type u
β : Type v
γ : Type w
s : WSeq α
a : α
h✝ : a ∈ s
n : ℕ
h : some a ∈ s.get? n
a' : α
s' : WSeq α
om : some (a, s') ∈ (s.drop n).destruct
i : a' = a
⊢ ∃ s', some (a, s') ∈ (s.drop n).destruct
state_after: no goals
tactic: exact ⟨_, om⟩