/-- Recursion on `Nat.Partrec.Code` is primitive recursive. -/
theorem rec_prim {α σ} [Primcodable α] [Primcodable σ] {c : α → Code} (hc : Primrec c) {z : α → σ}
    (hz : Primrec z) {s : α → σ} (hs : Primrec s) {l : α → σ} (hl : Primrec l) {r : α → σ}
    (hr : Primrec r) {pr : α → Code → Code → σ → σ → σ}
    (hpr : Primrec fun a : α × Code × Code × σ × σ => pr a.1 a.2.1 a.2.2.1 a.2.2.2.1 a.2.2.2.2)
    {co : α → Code → Code → σ → σ → σ}
    (hco : Primrec fun a : α × Code × Code × σ × σ => co a.1 a.2.1 a.2.2.1 a.2.2.2.1 a.2.2.2.2)
    {pc : α → Code → Code → σ → σ → σ}
    (hpc : Primrec fun a : α × Code × Code × σ × σ => pc a.1 a.2.1 a.2.2.1 a.2.2.2.1 a.2.2.2.2)
    {rf : α → Code → σ → σ} (hrf : Primrec fun a : α × Code × σ => rf a.1 a.2.1 a.2.2) :
    let F (a : α) (c : Code) : σ :=
      Nat.Partrec.Code.recOn c (z a) (s a) (l a) (r a) (pr a) (co a) (pc a) (rf a)
    Primrec fun a => F a (c a) := by
  intros F
  let G₁ : (α × List σ) × ℕ × ℕ → Option σ := fun p =>
    let a := p.1.1
    let IH := p.1.2
    let n := p.2.1
    let m := p.2.2
    (IH.get? m).bind fun s =>
      (IH.get? m.unpair.1).bind fun s₁ =>
        (IH.get? m.unpair.2).map fun s₂ =>
          cond n.bodd
            (cond n.div2.bodd (rf a (ofNat Code m) s)
              (pc a (ofNat Code m.unpair.1) (ofNat Code m.unpair.2) s₁ s₂))
            (cond n.div2.bodd (co a (ofNat Code m.unpair.1) (ofNat Code m.unpair.2) s₁ s₂)
              (pr a (ofNat Code m.unpair.1) (ofNat Code m.unpair.2) s₁ s₂))
  have : Primrec G₁ := by
    refine' option_bind (list_get?.comp (snd.comp fst) (snd.comp snd)) _
    unfold Primrec₂
    refine' option_bind ((list_get?.comp (snd.comp fst) (fst.comp <| Primrec.unpair.comp
            (snd.comp snd))).comp fst) _
    unfold Primrec₂
    refine'
      option_map
        ((list_get?.comp (snd.comp fst) (snd.comp <| Primrec.unpair.comp (snd.comp snd))).comp <|
          fst.comp fst)
        _
    have a : Primrec (fun p : ((((α × List σ) × ℕ × ℕ) × σ) × σ) × σ => p.1.1.1.1.1) :=
      fst.comp (fst.comp <| fst.comp <| fst.comp fst)
    have n : Primrec (fun p : ((((α × List σ) × ℕ × ℕ) × σ) × σ) × σ => p.1.1.1.2.1) :=
      fst.comp (snd.comp <| fst.comp <| fst.comp fst)
    have m : Primrec (fun p : ((((α × List σ) × ℕ × ℕ) × σ) × σ) × σ => p.1.1.1.2.2) :=
      snd.comp (snd.comp <| fst.comp <| fst.comp fst)
    have m₁ := fst.comp (Primrec.unpair.comp m)
    have m₂ := snd.comp (Primrec.unpair.comp m)
    have s : Primrec (fun p : ((((α × List σ) × ℕ × ℕ) × σ) × σ) × σ => p.1.1.2) :=
      snd.comp (fst.comp fst)
    have s₁ : Primrec (fun p : ((((α × List σ) × ℕ × ℕ) × σ) × σ) × σ => p.1.2) :=
      snd.comp fst
    have s₂ : Primrec (fun p : ((((α × List σ) × ℕ × ℕ) × σ) × σ) × σ => p.2) :=
      snd
    have h₁ := hrf.comp <| a.pair (((Primrec.ofNat Code).comp m).pair s)
    have h₂ := hpc.comp <| a.pair (((Primrec.ofNat Code).comp m₁).pair <|
      ((Primrec.ofNat Code).comp m₂).pair <| s₁.pair s₂)
    

Proof state:
α : Type u_1
σ : Type u_2
inst✝¹ : Primcodable α
inst✝ : Primcodable σ
c : α → Code
hc : Primrec c
z : α → σ
hz : Primrec z
s✝ : α → σ
hs : Primrec s✝
l : α → σ
hl : Primrec l
r : α → σ
hr : Primrec r
pr : α → Code → Code → σ → σ → σ
hpr : Primrec fun a => pr a.1 a.2.1 a.2.2.1 a.2.2.2.1 a.2.2.2.2
co : α → Code → Code → σ → σ → σ
hco : Primrec fun a => co a.1 a.2.1 a.2.2.1 a.2.2.2.1 a.2.2.2.2
pc : α → Code → Code → σ → σ → σ
hpc : Primrec fun a => pc a.1 a.2.1 a.2.2.1 a.2.2.2.1 a.2.2.2.2
rf : α → Code → σ → σ
hrf : Primrec fun a => rf a.1 a.2.1 a.2.2
F : α → Code → σ := fun a c => Code.recOn c (z a) (s✝ a) (l a) (r a) (pr a) (co a) (pc a) (rf a)
G₁ : (α × List σ) × ℕ × ℕ → Option σ :=
  fun p =>
    let a := p.1.1;
    let IH := p.1.2;
    let n := p.2.1;
    let m := p.2.2;
    Option.bind (List.get? IH m) fun s =>
      Option.bind (List.get? IH (unpair m).1) fun s₁ =>
        Option.map
          (fun s₂ =>
            bif bodd n then
              bif bodd (div2 n) then rf a (ofNat Code m) s
              else pc a (ofNat Code (unpair m).1) (ofNat Code (unpair m).2) s₁ s₂
            else
              bif bodd (div2 n) then co a (ofNat Code (unpair m).1) (ofNat Code (unpair m).2) s₁ s₂
              else pr a (ofNat Code (unpair m).1) (ofNat Code (unpair m).2) s₁ s₂)
          (List.get? IH (unpair m).2)
a : Primrec fun p => p.1.1.1.1.1
n : Primrec fun p => p.1.1.1.2.1
m : Primrec fun p => p.1.1.1.2.2
m₁ : Primrec fun a => (unpair a.1.1.1.2.2).1
m₂ : Primrec fun a => (unpair a.1.1.1.2.2).2
s : Primrec fun p => p.1.1.2
s₁ : Primrec fun p => p.1.2
s₂ : Primrec fun p => p.2
h₁ :
  Primrec fun a =>
    rf (a.1.1.1.1.1, ofNat Code a.1.1.1.2.2, a.1.1.2).1 (a.1.1.1.1.1, ofNat Code a.1.1.1.2.2, a.1.1.2).2.1
      (a.1.1.1.1.1, ofNat Code a.1.1.1.2.2, a.1.1.2).2.2
h₂ :
  Primrec fun a =>
    pc (a.1.1.1.1.1, ofNat Code (unpair a.1.1.1.2.2).1, ofNat Code (unpair a.1.1.1.2.2).2, a.1.2, a.2).1
      (a.1.1.1.1.1, ofNat Code (unpair a.1.1.1.2.2).1, ofNat Code (unpair a.1.1.1.2.2).2, a.1.2, a.2).2.1
      (a.1.1.1.1.1, ofNat Code (unpair a.1.1.1.2.2).1, ofNat Code (unpair a.1.1.1.2.2).2, a.1.2, a.2).2.2.1
      (a.1.1.1.1.1, ofNat Code (unpair a.1.1.1.2.2).1, ofNat Code (unpair a.1.1.1.2.2).2, a.1.2, a.2).2.2.2.1
      (a.1.1.1.1.1, ofNat Code (unpair a.1.1.1.2.2).1, ofNat Code (unpair a.1.1.1.2.2).2, a.1.2, a.2).2.2.2.2
⊢ Primrec₂ fun p s₂ =>
    bif bodd p.1.1.2.1 then
      bif bodd (div2 p.1.1.2.1) then rf p.1.1.1.1 (ofNat Code p.1.1.2.2) p.1.2
      else pc p.1.1.1.1 (ofNat Code (unpair p.1.1.2.2).1) (ofNat Code (unpair p.1.1.2.2).2) p.2 s₂
    else
      bif bodd (div2 p.1.1.2.1) then
        co p.1.1.1.1 (ofNat Code (unpair p.1.1.2.2).1) (ofNat Code (unpair p.1.1.2.2).2) p.2 s₂
      else pr p.1.1.1.1 (ofNat Code (unpair p.1.1.2.2).1) (ofNat Code (unpair p.1.1.2.2).2) p.2 s₂

Next tactic:
have h₃ := hco.comp <| a.pair
      (((Primrec.ofNat Code).comp m₁).pair <| ((Primrec.ofNat Code).comp m₂).pair <| s₁.pair s₂)