Skip to content

Commit dcbaf1a

Browse files
committed
refactor: make Nat.Partrec protected (#33891)
`Nat.Primrec` is protected to avoid confusion with `Primrec`, but `Nat.Partrec` is not. Furthermore, `Nat.Partrec` is a definition in recursion theory, so frequently used under `open Nat`, and as it is an auxiliary definition of `Partrec`, confusion is particularly problematic. In this PR, we make `Nat.Partrec` protected. Co-authored-by: Komyyy <pol_tta@outlook.jp>
1 parent c3c2870 commit dcbaf1a

File tree

3 files changed

+26
-24
lines changed

3 files changed

+26
-24
lines changed

Mathlib/Computability/Halting.lean

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ open List.Vector Partrec Computable
305305

306306
open Nat.Partrec'
307307

308-
theorem to_part {n f} (pf : @Partrec' n f) : _root_.Partrec f := by
308+
theorem to_part {n f} (pf : @Partrec' n f) : Partrec f := by
309309
induction pf with
310310
| prim hf => exact hf.to_prim.to_comp
311311
| comp _ _ _ hf hg => exact (Partrec.vector_mOfFn hg).bind (hf.comp snd)
@@ -390,7 +390,7 @@ theorem rfindOpt {n} {f : List.Vector ℕ (n + 1) → ℕ} (hf : @Partrec' (n +
390390

391391
open Nat.Partrec.Code
392392

393-
theorem of_part : ∀ {n f}, _root_.Partrec f → @Partrec' n f :=
393+
theorem of_part : ∀ {n f}, Partrec f → @Partrec' n f :=
394394
@(suffices ∀ f, Nat.Partrec f → @Partrec' 1 fun v => f v.head from fun {n f} hf => by
395395
let g := fun n₁ =>
396396
(Part.ofOption (decode (α := List.Vector ℕ n) n₁)).bind (fun a => Part.map encode (f a))
@@ -407,10 +407,10 @@ theorem of_part : ∀ {n f}, _root_.Partrec f → @Partrec' n f :=
407407
(Primrec.vector_head.pair (_root_.Primrec.const c)).pair <|
408408
Primrec.vector_head.comp Primrec.vector_tail)
409409

410-
theorem part_iff {n f} : @Partrec' n f ↔ _root_.Partrec f :=
410+
theorem part_iff {n f} : @Partrec' n f ↔ Partrec f :=
411411
⟨to_part, of_part⟩
412412

413-
theorem part_iff₁ {f : ℕ →. ℕ} : (@Partrec' 1 fun v => f v.head) ↔ _root_.Partrec f :=
413+
theorem part_iff₁ {f : ℕ →. ℕ} : (@Partrec' 1 fun v => f v.head) ↔ Partrec f :=
414414
part_iff.trans
415415
fun h =>
416416
(h.comp <| (Primrec.vector_ofFn fun _ => _root_.Primrec.id).to_comp).of_eq fun v => by

Mathlib/Computability/Partrec.lean

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -156,27 +156,29 @@ theorem rfindOpt_mono {α} {f : ℕ → Option α} (H : ∀ {a m n}, m ≤ n →
156156
have := (H (le_max_left _ _) h).symm.trans (H (le_max_right _ _) hk)
157157
simp at this; simp [this, get_mem]⟩
158158

159-
/-- `Partrec f` means that the partial function `f : ℕ →. ℕ` is partially recursive. -/
160-
inductive Partrec : (ℕ →. ℕ) → Prop
161-
| zero : Partrec (pure 0)
162-
| succ : Partrec succ
163-
| left : Partrec ↑fun n : ℕ => n.unpair.1
164-
| right : Partrec ↑fun n : ℕ => n.unpair.2
165-
| pair {f g} : Partrec f → Partrec g → Partrec fun n => pair <$> f n <*> g n
166-
| comp {f g} : Partrec f → Partrec g → Partrec fun n => g n >>= f
167-
| prec {f g} : Partrec f → Partrec g → Partrec (unpaired fun a n =>
159+
/-- `Nat.Partrec f` means that the partial function `f : ℕ →. ℕ` is partially recursive. -/
160+
protected inductive Partrec : (ℕ →. ℕ) → Prop
161+
| zero : Nat.Partrec (pure 0)
162+
| succ : Nat.Partrec succ
163+
| left : Nat.Partrec ↑fun n : ℕ => n.unpair.1
164+
| right : Nat.Partrec ↑fun n : ℕ => n.unpair.2
165+
| pair {f g} : Nat.Partrec f → Nat.Partrec g → Nat.Partrec fun n => pair <$> f n <*> g n
166+
| comp {f g} : Nat.Partrec f → Nat.Partrec g → Nat.Partrec fun n => g n >>= f
167+
| prec {f g} : Nat.Partrec f → Nat.Partrec g → Nat.Partrec (unpaired fun a n =>
168168
n.rec (f a) fun y IH => do let i ← IH; g (pair a (pair y i)))
169-
| rfind {f} : Partrec f → Partrec fun a => rfind fun n => (fun m => m = 0) <$> f (pair a n)
169+
| rfind {f} : Nat.Partrec f →
170+
Nat.Partrec fun a => rfind fun n => (fun m => m = 0) <$> f (pair a n)
170171

171172
namespace Partrec
172173

173-
theorem of_eq {f g : ℕ →. ℕ} (hf : Partrec f) (H : ∀ n, f n = g n) : Partrec g :=
174+
theorem of_eq {f g : ℕ →. ℕ} (hf : Nat.Partrec f) (H : ∀ n, f n = g n) : Nat.Partrec g :=
174175
(funext H : f = g) ▸ hf
175176

176-
theorem of_eq_tot {f : ℕ →. ℕ} {g : ℕ → ℕ} (hf : Partrec f) (H : ∀ n, g n ∈ f n) : Partrec g :=
177+
theorem of_eq_tot {f : ℕ →. ℕ} {g : ℕ → ℕ} (hf : Nat.Partrec f) (H : ∀ n, g n ∈ f n) :
178+
Nat.Partrec g :=
177179
hf.of_eq fun n => eq_some_iff.2 (H n)
178180

179-
theorem of_primrec {f : ℕ → ℕ} (hf : Nat.Primrec f) : Partrec f := by
181+
theorem of_primrec {f : ℕ → ℕ} (hf : Nat.Primrec f) : Nat.Partrec f := by
180182
induction hf with
181183
| zero => exact zero
182184
| succ => exact succ
@@ -196,21 +198,21 @@ theorem of_primrec {f : ℕ → ℕ} (hf : Nat.Primrec f) : Partrec f := by
196198
simp only [mem_bind_iff, mem_some_iff]
197199
exact ⟨_, IH, rfl⟩
198200

199-
protected theorem some : Partrec some :=
201+
protected theorem some : Nat.Partrec some :=
200202
of_primrec Primrec.id
201203

202-
theorem none : Partrec fun _ => none :=
204+
theorem none : Nat.Partrec fun _ => none :=
203205
(of_primrec (Nat.Primrec.const 1)).rfind.of_eq fun _ =>
204206
eq_none_iff.2 fun _ ⟨h, _⟩ => by simp at h
205207

206-
theorem prec' {f g h} (hf : Partrec f) (hg : Partrec g) (hh : Partrec h) :
207-
Partrec fun a => (f a).bind fun n => n.rec (g a)
208+
theorem prec' {f g h} (hf : Nat.Partrec f) (hg : Nat.Partrec g) (hh : Nat.Partrec h) :
209+
Nat.Partrec fun a => (f a).bind fun n => n.rec (g a)
208210
fun y IH => do {let i ← IH; h (Nat.pair a (Nat.pair y i))} :=
209211
((prec hg hh).comp (pair Partrec.some hf)).of_eq fun a =>
210212
ext fun s => by simp [Seq.seq]
211213

212214
set_option linter.flexible false in -- TODO: revisit this after #13791 is merged
213-
theorem ppred : Partrec fun n => ppred n :=
215+
theorem ppred : Nat.Partrec fun n => ppred n :=
214216
have : Primrec₂ fun n m => if n = Nat.succ m then 0 else 1 :=
215217
(Primrec.ite
216218
(@PrimrecRel.comp _ _ _ _ _ _ _ _ _

Mathlib/Computability/PartrecCode.lean

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1028,13 +1028,13 @@ theorem fixed_point₂ {f : Code → ℕ →. ℕ} (hf : Partrec₂ f) : ∃ c :
10281028
end
10291029

10301030
/-- There are only countably many partial recursive partial functions `ℕ →. ℕ`. -/
1031-
instance : Countable {f : ℕ →. ℕ // _root_.Partrec f} := by
1031+
instance : Countable {f : ℕ →. ℕ // Partrec f} := by
10321032
apply Function.Surjective.countable (f := fun c => ⟨eval c, eval_part.comp (.const c) .id⟩)
10331033
intro ⟨f, hf⟩; simpa using exists_code.1 hf
10341034

10351035
/-- There are only countably many computable functions `ℕ → ℕ`. -/
10361036
instance : Countable {f : ℕ → ℕ // Computable f} :=
1037-
@Function.Injective.countable {f : ℕ → ℕ // Computable f} {f : ℕ →. ℕ // _root_.Partrec f} _
1037+
@Function.Injective.countable {f : ℕ → ℕ // Computable f} {f : ℕ →. ℕ // Partrec f} _
10381038
(fun f => ⟨f.val, f.2⟩)
10391039
(fun _ _ h => Subtype.val_inj.1 (PFun.lift_injective (by simpa using h)))
10401040

0 commit comments

Comments
 (0)