Theorem: Partrec.nat_casesOn_right
File: Mathlib/Computability/Partrec.lean

tactic: simp
state_before: α : Type u_2
β : Type ?u.130006
γ : Type ?u.130009
σ : Type u_1
inst✝³ : Primcodable α
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ
f : α → ℕ
g : α → σ
h : α → ℕ →. σ
hf : Computable f
hg : Computable g
hh : Partrec₂ h
a : α
⊢ Nat.rec (↑g a) (fun y IH => Part.bind IH fun i => h (a, y, i).fst (Nat.pred (f (a, y, i).fst))) (f a) =
    Nat.casesOn (f a) (Part.some (g a)) (h a)

tactic: cases' f a with n <;> simp
state_before: α : Type u_2
β : Type ?u.130006
γ : Type ?u.130009
σ : Type u_1
inst✝³ : Primcodable α
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ
f : α → ℕ
g : α → σ
h : α → ℕ →. σ
hf : Computable f
hg : Computable g
hh : Partrec₂ h
a : α
⊢ Nat.rec (Part.some (g a)) (fun y IH => Part.bind IH fun i => h a (Nat.pred (f a))) (f a) =
    Nat.rec (Part.some (g a)) (fun n n_ih => h a n) (f a)

tactic: refine' ext fun b => ⟨fun H => _, fun H => _⟩
state_before: case succ
α : Type u_2
β : Type ?u.130006
γ : Type ?u.130009
σ : Type u_1
inst✝³ : Primcodable α
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ
f : α → ℕ
g : α → σ
h : α → ℕ →. σ
hf : Computable f
hg : Computable g
hh : Partrec₂ h
a : α
n : ℕ
⊢ (Part.bind (Nat.rec (Part.some (g a)) (fun y IH => Part.bind IH fun i => h a n) n) fun i => h a n) = h a n

tactic: rcases mem_bind_iff.1 H with ⟨c, _, h₂⟩
state_before: case succ.refine'_1
α : Type u_2
β : Type ?u.130006
γ : Type ?u.130009
σ : Type u_1
inst✝³ : Primcodable α
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ
f : α → ℕ
g : α → σ
h : α → ℕ →. σ
hf : Computable f
hg : Computable g
hh : Partrec₂ h
a : α
n : ℕ
b : σ
H : b ∈ Part.bind (Nat.rec (Part.some (g a)) (fun y IH => Part.bind IH fun i => h a n) n) fun i => h a n
⊢ b ∈ h a n

tactic: exact h₂
state_before: case succ.refine'_1.intro.intro
α : Type u_2
β : Type ?u.130006
γ : Type ?u.130009
σ : Type u_1
inst✝³ : Primcodable α
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ
f : α → ℕ
g : α → σ
h : α → ℕ →. σ
hf : Computable f
hg : Computable g
hh : Partrec₂ h
a : α
n : ℕ
b : σ
H : b ∈ Part.bind (Nat.rec (Part.some (g a)) (fun y IH => Part.bind IH fun i => h a n) n) fun i => h a n
c : σ
left✝ : c ∈ Nat.rec (Part.some (g a)) (fun y IH => Part.bind IH fun i => h a n) n
h₂ : b ∈ h a n
⊢ b ∈ h a n

tactic: have : ∀ m, (Nat.rec (motive := fun _ => Part σ)
    (Part.some (g a)) (fun y IH => IH.bind fun _ => h a n) m).Dom := by
  intro m
  induction m <;> simp [*, H.fst]
state_before: case succ.refine'_2
α : Type u_2
β : Type ?u.130006
γ : Type ?u.130009
σ : Type u_1
inst✝³ : Primcodable α
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ
f : α → ℕ
g : α → σ
h : α → ℕ →. σ
hf : Computable f
hg : Computable g
hh : Partrec₂ h
a : α
n : ℕ
b : σ
H : b ∈ h a n
⊢ b ∈ Part.bind (Nat.rec (Part.some (g a)) (fun y IH => Part.bind IH fun i => h a n) n) fun i => h a n

tactic: exact ⟨⟨this n, H.fst⟩, H.snd⟩
state_before: case succ.refine'_2
α : Type u_2
β : Type ?u.130006
γ : Type ?u.130009
σ : Type u_1
inst✝³ : Primcodable α
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ
f : α → ℕ
g : α → σ
h : α → ℕ →. σ
hf : Computable f
hg : Computable g
hh : Partrec₂ h
a : α
n : ℕ
b : σ
H : b ∈ h a n
this : ∀ (m : ℕ), (Nat.rec (Part.some (g a)) (fun y IH => Part.bind IH fun x => h a n) m).Dom
⊢ b ∈ Part.bind (Nat.rec (Part.some (g a)) (fun y IH => Part.bind IH fun i => h a n) n) fun i => h a n

tactic: intro m
state_before: α : Type u_2
β : Type ?u.130006
γ : Type ?u.130009
σ : Type u_1
inst✝³ : Primcodable α
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ
f : α → ℕ
g : α → σ
h : α → ℕ →. σ
hf : Computable f
hg : Computable g
hh : Partrec₂ h
a : α
n : ℕ
b : σ
H : b ∈ h a n
⊢ ∀ (m : ℕ), (Nat.rec (Part.some (g a)) (fun y IH => Part.bind IH fun x => h a n) m).Dom

tactic: induction m <;> simp [*, H.fst]
state_before: α : Type u_2
β : Type ?u.130006
γ : Type ?u.130009
σ : Type u_1
inst✝³ : Primcodable α
inst✝² : Primcodable β
inst✝¹ : Primcodable γ
inst✝ : Primcodable σ
f : α → ℕ
g : α → σ
h : α → ℕ →. σ
hf : Computable f
hg : Computable g
hh : Partrec₂ h
a : α
n : ℕ
b : σ
H : b ∈ h a n
m : ℕ
⊢ (Nat.rec (Part.some (g a)) (fun y IH => Part.bind IH fun x => h a n) m).Dom