Theorem: Turing.ToPartrec.stepRet_then
File: Mathlib/Computability/TMToPartrec.lean

tactic: induction k generalizing v <;> simp only [Cont.then, stepRet, *] <;>
  try { simp only [Cfg.then]; done }
state_before: k k' : Cont
v : List ℕ
⊢ stepRet (Cont.then k k') v = Cfg.then (stepRet k v) k'

tactic: case cons₁ =>
  rw [← stepNormal_then]
  rfl
state_before: case cons₁
k' : Cont
a✝² : Code
a✝¹ : List ℕ
a✝ : Cont
a_ih✝ : ∀ {v : List ℕ}, stepRet (Cont.then a✝ k') v = Cfg.then (stepRet a✝ v) k'
v : List ℕ
⊢ stepNormal a✝² (Cont.cons₂ v (Cont.then a✝ k')) a✝¹ = Cfg.then (stepNormal a✝² (Cont.cons₂ v a✝) a✝¹) k'

case comp
k' : Cont
a✝¹ : Code
a✝ : Cont
a_ih✝ : ∀ {v : List ℕ}, stepRet (Cont.then a✝ k') v = Cfg.then (stepRet a✝ v) k'
v : List ℕ
⊢ stepNormal a✝¹ (Cont.then a✝ k') v = Cfg.then (stepNormal a✝¹ a✝ v) k'

case fix
k' : Cont
a✝¹ : Code
a✝ : Cont
a_ih✝ : ∀ {v : List ℕ}, stepRet (Cont.then a✝ k') v = Cfg.then (stepRet a✝ v) k'
v : List ℕ
⊢ (if List.headI v = 0 then Cfg.then (stepRet a✝ (List.tail v)) k'
    else stepNormal a✝¹ (Cont.fix a✝¹ (Cont.then a✝ k')) (List.tail v)) =
    Cfg.then (if List.headI v = 0 then stepRet a✝ (List.tail v) else stepNormal a✝¹ (Cont.fix a✝¹ a✝) (List.tail v)) k'

tactic: case comp =>
  rw [← stepNormal_then]
state_before: case comp
k' : Cont
a✝¹ : Code
a✝ : Cont
a_ih✝ : ∀ {v : List ℕ}, stepRet (Cont.then a✝ k') v = Cfg.then (stepRet a✝ v) k'
v : List ℕ
⊢ stepNormal a✝¹ (Cont.then a✝ k') v = Cfg.then (stepNormal a✝¹ a✝ v) k'

case fix
k' : Cont
a✝¹ : Code
a✝ : Cont
a_ih✝ : ∀ {v : List ℕ}, stepRet (Cont.then a✝ k') v = Cfg.then (stepRet a✝ v) k'
v : List ℕ
⊢ (if List.headI v = 0 then Cfg.then (stepRet a✝ (List.tail v)) k'
    else stepNormal a✝¹ (Cont.fix a✝¹ (Cont.then a✝ k')) (List.tail v)) =
    Cfg.then (if List.headI v = 0 then stepRet a✝ (List.tail v) else stepNormal a✝¹ (Cont.fix a✝¹ a✝) (List.tail v)) k'

tactic: rw [← stepNormal_then]
state_before: k' : Cont
a✝² : Code
a✝¹ : List ℕ
a✝ : Cont
a_ih✝ : ∀ {v : List ℕ}, stepRet (Cont.then a✝ k') v = Cfg.then (stepRet a✝ v) k'
v : List ℕ
⊢ stepNormal a✝² (Cont.cons₂ v (Cont.then a✝ k')) a✝¹ = Cfg.then (stepNormal a✝² (Cont.cons₂ v a✝) a✝¹) k'

tactic: rfl
state_before: k' : Cont
a✝² : Code
a✝¹ : List ℕ
a✝ : Cont
a_ih✝ : ∀ {v : List ℕ}, stepRet (Cont.then a✝ k') v = Cfg.then (stepRet a✝ v) k'
v : List ℕ
⊢ stepNormal a✝² (Cont.cons₂ v (Cont.then a✝ k')) a✝¹ = stepNormal a✝² (Cont.then (Cont.cons₂ v a✝) k') a✝¹

tactic: rw [← stepNormal_then]
state_before: k' : Cont
a✝¹ : Code
a✝ : Cont
a_ih✝ : ∀ {v : List ℕ}, stepRet (Cont.then a✝ k') v = Cfg.then (stepRet a✝ v) k'
v : List ℕ
⊢ stepNormal a✝¹ (Cont.then a✝ k') v = Cfg.then (stepNormal a✝¹ a✝ v) k'

tactic: split_ifs
state_before: k' : Cont
a✝¹ : Code
a✝ : Cont
k_ih : ∀ {v : List ℕ}, stepRet (Cont.then a✝ k') v = Cfg.then (stepRet a✝ v) k'
v : List ℕ
⊢ (if List.headI v = 0 then Cfg.then (stepRet a✝ (List.tail v)) k'
    else stepNormal a✝¹ (Cont.fix a✝¹ (Cont.then a✝ k')) (List.tail v)) =
    Cfg.then (if List.headI v = 0 then stepRet a✝ (List.tail v) else stepNormal a✝¹ (Cont.fix a✝¹ a✝) (List.tail v)) k'

tactic: rw [← k_ih]
state_before: case inl
k' : Cont
a✝¹ : Code
a✝ : Cont
k_ih : ∀ {v : List ℕ}, stepRet (Cont.then a✝ k') v = Cfg.then (stepRet a✝ v) k'
v : List ℕ
h✝ : List.headI v = 0
⊢ Cfg.then (stepRet a✝ (List.tail v)) k' = Cfg.then (stepRet a✝ (List.tail v)) k'

tactic: rw [← stepNormal_then]
state_before: case inr
k' : Cont
a✝¹ : Code
a✝ : Cont
k_ih : ∀ {v : List ℕ}, stepRet (Cont.then a✝ k') v = Cfg.then (stepRet a✝ v) k'
v : List ℕ
h✝ : ¬List.headI v = 0
⊢ stepNormal a✝¹ (Cont.fix a✝¹ (Cont.then a✝ k')) (List.tail v) =
    Cfg.then (stepNormal a✝¹ (Cont.fix a✝¹ a✝) (List.tail v)) k'

tactic: rfl
state_before: case inr
k' : Cont
a✝¹ : Code
a✝ : Cont
k_ih : ∀ {v : List ℕ}, stepRet (Cont.then a✝ k') v = Cfg.then (stepRet a✝ v) k'
v : List ℕ
h✝ : ¬List.headI v = 0
⊢ stepNormal a✝¹ (Cont.fix a✝¹ (Cont.then a✝ k')) (List.tail v) =
    stepNormal a✝¹ (Cont.then (Cont.fix a✝¹ a✝) k') (List.tail v)