Theorem: Turing.ToPartrec.stepNormal.is_ret
File: Mathlib/Computability/TMToPartrec.lean

tactic: induction c generalizing k v
state_before: c : Code
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal c k v = Cfg.ret k' v'

tactic: iterate 3 exact ⟨_, _, rfl⟩
state_before: case zero'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal Code.zero' k v = Cfg.ret k' v'

case succ
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal Code.succ k v = Cfg.ret k' v'

case tail
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal Code.tail k v = Cfg.ret k' v'

case cons
a✝¹ a✝ : Code
a_ih✝¹ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝¹ k v = Cfg.ret k' v'
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.cons a✝¹ a✝) k v = Cfg.ret k' v'

case comp
a✝¹ a✝ : Code
a_ih✝¹ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝¹ k v = Cfg.ret k' v'
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.comp a✝¹ a✝) k v = Cfg.ret k' v'

case case
a✝¹ a✝ : Code
a_ih✝¹ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝¹ k v = Cfg.ret k' v'
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.case a✝¹ a✝) k v = Cfg.ret k' v'

case fix
a✝ : Code
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.fix a✝) k v = Cfg.ret k' v'

tactic: case cons _f fs IHf _IHfs => apply IHf
state_before: case cons
a✝¹ a✝ : Code
a_ih✝¹ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝¹ k v = Cfg.ret k' v'
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.cons a✝¹ a✝) k v = Cfg.ret k' v'

case comp
a✝¹ a✝ : Code
a_ih✝¹ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝¹ k v = Cfg.ret k' v'
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.comp a✝¹ a✝) k v = Cfg.ret k' v'

case case
a✝¹ a✝ : Code
a_ih✝¹ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝¹ k v = Cfg.ret k' v'
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.case a✝¹ a✝) k v = Cfg.ret k' v'

case fix
a✝ : Code
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.fix a✝) k v = Cfg.ret k' v'

tactic: case comp f _g _IHf IHg => apply IHg
state_before: case comp
a✝¹ a✝ : Code
a_ih✝¹ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝¹ k v = Cfg.ret k' v'
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.comp a✝¹ a✝) k v = Cfg.ret k' v'

case case
a✝¹ a✝ : Code
a_ih✝¹ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝¹ k v = Cfg.ret k' v'
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.case a✝¹ a✝) k v = Cfg.ret k' v'

case fix
a✝ : Code
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.fix a✝) k v = Cfg.ret k' v'

tactic: case case f g IHf IHg =>
  rw [stepNormal]
  simp only []
  cases v.headI <;> simp only [] <;> [apply IHf; apply IHg]
state_before: case case
a✝¹ a✝ : Code
a_ih✝¹ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝¹ k v = Cfg.ret k' v'
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.case a✝¹ a✝) k v = Cfg.ret k' v'

case fix
a✝ : Code
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.fix a✝) k v = Cfg.ret k' v'

tactic: case fix f IHf => apply IHf
state_before: case fix
a✝ : Code
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.fix a✝) k v = Cfg.ret k' v'

tactic: exact ⟨_, _, rfl⟩
state_before: case tail
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal Code.tail k v = Cfg.ret k' v'

case cons
a✝¹ a✝ : Code
a_ih✝¹ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝¹ k v = Cfg.ret k' v'
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.cons a✝¹ a✝) k v = Cfg.ret k' v'

case comp
a✝¹ a✝ : Code
a_ih✝¹ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝¹ k v = Cfg.ret k' v'
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.comp a✝¹ a✝) k v = Cfg.ret k' v'

case case
a✝¹ a✝ : Code
a_ih✝¹ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝¹ k v = Cfg.ret k' v'
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.case a✝¹ a✝) k v = Cfg.ret k' v'

case fix
a✝ : Code
a_ih✝ : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal a✝ k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.fix a✝) k v = Cfg.ret k' v'

tactic: apply IHf
state_before: _f fs : Code
IHf : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal _f k v = Cfg.ret k' v'
_IHfs : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal fs k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.cons _f fs) k v = Cfg.ret k' v'

tactic: apply IHg
state_before: f _g : Code
_IHf : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal f k v = Cfg.ret k' v'
IHg : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal _g k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.comp f _g) k v = Cfg.ret k' v'

tactic: rw [stepNormal]
state_before: f g : Code
IHf : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal f k v = Cfg.ret k' v'
IHg : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal g k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.case f g) k v = Cfg.ret k' v'

tactic: simp only []
state_before: f g : Code
IHf : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal f k v = Cfg.ret k' v'
IHg : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal g k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v',
    (fun k v => Nat.rec (stepNormal f k (List.tail v)) (fun y x => stepNormal g k (y :: List.tail v)) (List.headI v)) k
        v =
      Cfg.ret k' v'

tactic: cases v.headI <;> simp only [] <;> [apply IHf; apply IHg]
state_before: f g : Code
IHf : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal f k v = Cfg.ret k' v'
IHg : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal g k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v',
    Nat.rec (stepNormal f k (List.tail v)) (fun y x => stepNormal g k (y :: List.tail v)) (List.headI v) = Cfg.ret k' v'

tactic: apply IHf
state_before: f : Code
IHf : ∀ (k : Cont) (v : List ℕ), ∃ k' v', stepNormal f k v = Cfg.ret k' v'
k : Cont
v : List ℕ
⊢ ∃ k' v', stepNormal (Code.fix f) k v = Cfg.ret k' v'