Theorem: Computation.eq_thinkN
File: Mathlib/Data/Seq/Computation.lean

tactic: revert s
state_before: α : Type u
β : Type v
γ : Type w
s : Computation α
a : α
n : ℕ
h : s.Results a n
⊢ s = (pure a).thinkN n
state_after: α : Type u
β : Type v
γ : Type w
a : α
n : ℕ
⊢ ∀ {s : Computation α}, s.Results a n → s = (pure a).thinkN n

tactic: induction' n with n IH <;> intro s <;> apply recOn s (fun a' => _) fun s => _ <;> intro a h
state_before: α : Type u
β : Type v
γ : Type w
a : α
n : ℕ
⊢ ∀ {s : Computation α}, s.Results a n → s = (pure a).thinkN n
state_after: α : Type u
β : Type v
γ : Type w
a✝ : α
s : Computation α
a : α
h : (pure a).Results a✝ 0
⊢ pure a = (pure a✝).thinkN 0

α : Type u
β : Type v
γ : Type w
a✝ : α
s a : Computation α
h : a.think.Results a✝ 0
⊢ a.think = (pure a✝).thinkN 0

α : Type u
β : Type v
γ : Type w
a✝ : α
n : ℕ
IH : ∀ {s : Computation α}, s.Results a✝ n → s = (pure a✝).thinkN n
s : Computation α
a : α
h : (pure a).Results a✝ (n + 1)
⊢ pure a = (pure a✝).thinkN (n + 1)

α : Type u
β : Type v
γ : Type w
a✝ : α
n : ℕ
IH : ∀ {s : Computation α}, s.Results a✝ n → s = (pure a✝).thinkN n
s a : Computation α
h : a.think.Results a✝ (n + 1)
⊢ a.think = (pure a✝).thinkN (n + 1)

tactic: rw [← eq_of_pure_mem h.mem]
state_before: α : Type u
β : Type v
γ : Type w
a✝ : α
s : Computation α
a : α
h : (pure a).Results a✝ 0
⊢ pure a = (pure a✝).thinkN 0
state_after: α : Type u
β : Type v
γ : Type w
a✝ : α
s : Computation α
a : α
h : (pure a).Results a✝ 0
⊢ pure a✝ = (pure a✝).thinkN 0

tactic: rfl
state_before: α : Type u
β : Type v
γ : Type w
a✝ : α
s : Computation α
a : α
h : (pure a).Results a✝ 0
⊢ pure a✝ = (pure a✝).thinkN 0
state_after: no goals

tactic: cases' of_results_think h with n h
state_before: α : Type u
β : Type v
γ : Type w
a✝ : α
s a : Computation α
h : a.think.Results a✝ 0
⊢ a.think = (pure a✝).thinkN 0
state_after: case intro
α : Type u
β : Type v
γ : Type w
a✝ : α
s a : Computation α
h✝ : a.think.Results a✝ 0
n : ℕ
h : a.Results a✝ n ∧ 0 = n + 1
⊢ a.think = (pure a✝).thinkN 0

tactic: cases h
state_before: case intro
α : Type u
β : Type v
γ : Type w
a✝ : α
s a : Computation α
h✝ : a.think.Results a✝ 0
n : ℕ
h : a.Results a✝ n ∧ 0 = n + 1
⊢ a.think = (pure a✝).thinkN 0
state_after: case intro.intro
α : Type u
β : Type v
γ : Type w
a✝ : α
s a : Computation α
h : a.think.Results a✝ 0
n : ℕ
left✝ : a.Results a✝ n
right✝ : 0 = n + 1
⊢ a.think = (pure a✝).thinkN 0

tactic: contradiction
state_before: case intro.intro
α : Type u
β : Type v
γ : Type w
a✝ : α
s a : Computation α
h : a.think.Results a✝ 0
n : ℕ
left✝ : a.Results a✝ n
right✝ : 0 = n + 1
⊢ a.think = (pure a✝).thinkN 0
state_after: no goals

tactic: have := h.len_unique (results_pure _)
state_before: α : Type u
β : Type v
γ : Type w
a✝ : α
n : ℕ
IH : ∀ {s : Computation α}, s.Results a✝ n → s = (pure a✝).thinkN n
s : Computation α
a : α
h : (pure a).Results a✝ (n + 1)
⊢ pure a = (pure a✝).thinkN (n + 1)
state_after: α : Type u
β : Type v
γ : Type w
a✝ : α
n : ℕ
IH : ∀ {s : Computation α}, s.Results a✝ n → s = (pure a✝).thinkN n
s : Computation α
a : α
h : (pure a).Results a✝ (n + 1)
this : n + 1 = 0
⊢ pure a = (pure a✝).thinkN (n + 1)

tactic: contradiction
state_before: α : Type u
β : Type v
γ : Type w
a✝ : α
n : ℕ
IH : ∀ {s : Computation α}, s.Results a✝ n → s = (pure a✝).thinkN n
s : Computation α
a : α
h : (pure a).Results a✝ (n + 1)
this : n + 1 = 0
⊢ pure a = (pure a✝).thinkN (n + 1)
state_after: no goals

tactic: rw [IH (results_think_iff.1 h)]
state_before: α : Type u
β : Type v
γ : Type w
a✝ : α
n : ℕ
IH : ∀ {s : Computation α}, s.Results a✝ n → s = (pure a✝).thinkN n
s a : Computation α
h : a.think.Results a✝ (n + 1)
⊢ a.think = (pure a✝).thinkN (n + 1)
state_after: α : Type u
β : Type v
γ : Type w
a✝ : α
n : ℕ
IH : ∀ {s : Computation α}, s.Results a✝ n → s = (pure a✝).thinkN n
s a : Computation α
h : a.think.Results a✝ (n + 1)
⊢ ((pure a✝).thinkN n).think = (pure a✝).thinkN (n + 1)

tactic: rfl
state_before: α : Type u
β : Type v
γ : Type w
a✝ : α
n : ℕ
IH : ∀ {s : Computation α}, s.Results a✝ n → s = (pure a✝).thinkN n
s a : Computation α
h : a.think.Results a✝ (n + 1)
⊢ ((pure a✝).thinkN n).think = (pure a✝).thinkN (n + 1)
state_after: no goals