Theorem: Stream'.Seq.destruct_eq_cons
File: Mathlib/Data/Seq/Seq.lean

tactic: dsimp [destruct]
state_before: α : Type u
β : Type v
γ : Type w
s : Seq α
a : α
s' : Seq α
⊢ s.destruct = some (a, s') → s = cons a s'
state_after: α : Type u
β : Type v
γ : Type w
s : Seq α
a : α
s' : Seq α
⊢ Option.map (fun a' => (a', s.tail)) (s.get? 0) = some (a, s') → s = cons a s'

tactic: induction' f0 : get? s 0 with a' <;> intro h
state_before: α : Type u
β : Type v
γ : Type w
s : Seq α
a : α
s' : Seq α
⊢ Option.map (fun a' => (a', s.tail)) (s.get? 0) = some (a, s') → s = cons a s'
state_after: case none
α : Type u
β : Type v
γ : Type w
s : Seq α
a : α
s' : Seq α
f0 : s.get? 0 = none
h : Option.map (fun a' => (a', s.tail)) none = some (a, s')
⊢ s = cons a s'

case some
α : Type u
β : Type v
γ : Type w
s : Seq α
a : α
s' : Seq α
a' : α
f0 : s.get? 0 = some a'
h : Option.map (fun a' => (a', s.tail)) (some a') = some (a, s')
⊢ s = cons a s'

tactic: contradiction
state_before: case none
α : Type u
β : Type v
γ : Type w
s : Seq α
a : α
s' : Seq α
f0 : s.get? 0 = none
h : Option.map (fun a' => (a', s.tail)) none = some (a, s')
⊢ s = cons a s'
state_after: no goals

tactic: cases' s with f al
state_before: case some
α : Type u
β : Type v
γ : Type w
s : Seq α
a : α
s' : Seq α
a' : α
f0 : s.get? 0 = some a'
h : Option.map (fun a' => (a', s.tail)) (some a') = some (a, s')
⊢ s = cons a s'
state_after: case some.mk
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a'
h : Option.map (fun a' => (a', tail ⟨f, al⟩)) (some a') = some (a, s')
⊢ ⟨f, al⟩ = cons a s'

tactic: injections _ h1 h2
state_before: case some.mk
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a'
h : Option.map (fun a' => (a', tail ⟨f, al⟩)) (some a') = some (a, s')
⊢ ⟨f, al⟩ = cons a s'
state_after: case some.mk
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a'
h1 : a' = a
h2 : tail ⟨f, al⟩ = s'
⊢ ⟨f, al⟩ = cons a s'

tactic: rw [← h2]
state_before: case some.mk
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a'
h1 : a' = a
h2 : tail ⟨f, al⟩ = s'
⊢ ⟨f, al⟩ = cons a s'
state_after: case some.mk
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a'
h1 : a' = a
h2 : tail ⟨f, al⟩ = s'
⊢ ⟨f, al⟩ = cons a (tail ⟨f, al⟩)

tactic: apply Subtype.eq
state_before: case some.mk
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a'
h1 : a' = a
h2 : tail ⟨f, al⟩ = s'
⊢ ⟨f, al⟩ = cons a (tail ⟨f, al⟩)
state_after: case some.mk.a
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a'
h1 : a' = a
h2 : tail ⟨f, al⟩ = s'
⊢ ↑⟨f, al⟩ = ↑(cons a (tail ⟨f, al⟩))

tactic: dsimp [tail, cons]
state_before: case some.mk.a
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a'
h1 : a' = a
h2 : tail ⟨f, al⟩ = s'
⊢ ↑⟨f, al⟩ = ↑(cons a (tail ⟨f, al⟩))
state_after: case some.mk.a
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a'
h1 : a' = a
h2 : tail ⟨f, al⟩ = s'
⊢ f = some a :: f.tail

tactic: rw [h1] at f0
state_before: case some.mk.a
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a'
h1 : a' = a
h2 : tail ⟨f, al⟩ = s'
⊢ f = some a :: f.tail
state_after: case some.mk.a
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a
h1 : a' = a
h2 : tail ⟨f, al⟩ = s'
⊢ f = some a :: f.tail

tactic: rw [← f0]
state_before: case some.mk.a
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a
h1 : a' = a
h2 : tail ⟨f, al⟩ = s'
⊢ f = some a :: f.tail
state_after: case some.mk.a
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a
h1 : a' = a
h2 : tail ⟨f, al⟩ = s'
⊢ f = get? ⟨f, al⟩ 0 :: f.tail

tactic: exact (Stream'.eta f).symm
state_before: case some.mk.a
α : Type u
β : Type v
γ : Type w
a : α
s' : Seq α
a' : α
f : Stream' (Option α)
al : f.IsSeq
f0 : get? ⟨f, al⟩ 0 = some a
h1 : a' = a
h2 : tail ⟨f, al⟩ = s'
⊢ f = get? ⟨f, al⟩ 0 :: f.tail
state_after: no goals