@@ -12,15 +12,15 @@ import data.pfun
12
12
13
13
The partial recursive functions are defined similarly to the primitive
14
14
recursive functions, but now all functions are partial, implemented
15
- using the `roption ` monad, and there is an additional operation, called
15
+ using the `part ` monad, and there is an additional operation, called
16
16
μ-recursion, which performs unbounded minimization.
17
17
18
18
## References
19
19
20
20
* [ Mario Carneiro, *Formalizing computability theory via partial recursive functions* ] [carneiro2019 ]
21
21
-/
22
22
23
- open encodable denumerable roption
23
+ open encodable denumerable part
24
24
25
25
local attribute [-simp] not_forall
26
26
66
66
67
67
end rfind
68
68
69
- def rfind (p : ℕ →. bool) : roption ℕ :=
69
+ def rfind (p : ℕ →. bool) : part ℕ :=
70
70
⟨_, λ h, (rfind_x p h).1 ⟩
71
71
72
72
theorem rfind_spec {p : ℕ →. bool} {n : ℕ} (h : n ∈ rfind p) : tt ∈ p n :=
@@ -110,9 +110,9 @@ theorem rfind_zero_none
110
110
(p : ℕ →. bool) (p0 : p 0 = none) : rfind p = none :=
111
111
eq_none_iff.2 $ λ a h,
112
112
let ⟨n, h₁, h₂⟩ := rfind_dom'.1 h.fst in
113
- (p0 ▸ h₂ (zero_le _) : (@roption .none bool).dom)
113
+ (p0 ▸ h₂ (zero_le _) : (@part .none bool).dom)
114
114
115
- def rfind_opt {α} (f : ℕ → option α) : roption α :=
115
+ def rfind_opt {α} (f : ℕ → option α) : part α :=
116
116
(rfind (λ n, (f n).is_some)).bind (λ n, f n)
117
117
118
118
theorem rfind_opt_spec {α} {f : ℕ → option α} {a}
@@ -224,7 +224,7 @@ end nat
224
224
225
225
def partrec {α σ} [primcodable α] [primcodable σ]
226
226
(f : α →. σ) := nat.partrec (λ n,
227
- roption .bind (decode α n) (λ a, (f a).map encode))
227
+ part .bind (decode α n) (λ a, (f a).map encode))
228
228
229
229
def partrec₂ {α β σ} [primcodable α] [primcodable β] [primcodable σ]
230
230
(f : α → β →. σ) := partrec (λ p : α × β, f p.1 p.2 )
@@ -242,10 +242,10 @@ theorem primrec.to_comp {α σ} [primcodable α] [primcodable σ]
242
242
theorem primrec₂.to_comp {α β σ} [primcodable α] [primcodable β] [primcodable σ]
243
243
{f : α → β → σ} (hf : primrec₂ f) : computable₂ f := hf.to_comp
244
244
245
- theorem computable.part {α σ} [primcodable α] [primcodable σ]
245
+ protected theorem computable.partrec {α σ} [primcodable α] [primcodable σ]
246
246
{f : α → σ} (hf : computable f) : partrec (f : α →. σ) := hf
247
247
248
- theorem computable₂.part {α β σ} [primcodable α] [primcodable β] [primcodable σ]
248
+ protected theorem computable₂.partrec₂ {α β σ} [primcodable α] [primcodable β] [primcodable σ]
249
249
{f : α → β → σ} (hf : computable₂ f) : partrec₂ (λ a, (f a : β →. σ)) := hf
250
250
251
251
namespace computable
@@ -258,8 +258,8 @@ theorem of_eq {f g : α → σ} (hf : computable f) (H : ∀ n, f n = g n) : com
258
258
theorem const (s : σ) : computable (λ a : α, s) :=
259
259
(primrec.const _).to_comp
260
260
261
- theorem of_option {f : α → option β}
262
- (hf : computable f) : partrec (λ a, (f a : roption β)) :=
261
+ theorem of_option {f : α → option β} (hf : computable f) :
262
+ partrec (λ a, (f a : part β)) :=
263
263
(nat.partrec.ppred.comp hf).of_eq $ λ n, begin
264
264
cases decode α n with a; simp,
265
265
cases f a with b; simp
@@ -337,15 +337,15 @@ theorem of_eq_tot {f : α →. σ} {g : α → σ}
337
337
(hf : partrec f) (H : ∀ n, g n ∈ f n) : computable g :=
338
338
hf.of_eq (λ a, eq_some_iff.2 (H a))
339
339
340
- theorem none : partrec (λ a : α, @roption .none σ) :=
340
+ theorem none : partrec (λ a : α, @part .none σ) :=
341
341
nat.partrec.none.of_eq $ λ n, by cases decode α n; simp
342
342
343
- protected theorem some : partrec (@roption .some α) := computable.id
343
+ protected theorem some : partrec (@part .some α) := computable.id
344
344
345
- theorem _root_.decidable.partrec.const' (s : roption σ) [decidable s.dom] : partrec (λ a : α, s) :=
345
+ theorem _root_.decidable.partrec.const' (s : part σ) [decidable s.dom] : partrec (λ a : α, s) :=
346
346
(of_option (const (to_option s))).of_eq (λ a, of_to_option s)
347
347
348
- theorem const' (s : roption σ) : partrec (λ a : α, s) :=
348
+ theorem const' (s : part σ) : partrec (λ a : α, s) :=
349
349
by haveI := classical.dec s.dom; exact decidable.partrec.const' s
350
350
351
351
protected theorem bind {f : α →. β} {g : α → β →. σ}
@@ -357,7 +357,7 @@ protected theorem bind {f : α →. β} {g : α → β →. σ}
357
357
theorem map {f : α →. β} {g : α → β → σ}
358
358
(hf : partrec f) (hg : computable₂ g) : partrec (λ a, (f a).map (g a)) :=
359
359
by simpa [bind_some_eq_map] using
360
- @@partrec.bind _ _ _ (λ a b, roption .some (g a b)) hf hg
360
+ @@partrec.bind _ _ _ (λ a b, part .some (g a b)) hf hg
361
361
362
362
theorem to₂ {f : α × β →. σ} (hf : partrec f) : partrec₂ (λ a b, f (a, b)) :=
363
363
hf.of_eq $ λ ⟨a, b⟩, rfl
@@ -456,14 +456,14 @@ theorem rfind {p : α → ℕ →. bool} (hp : partrec₂ p) :
456
456
cases e : decode α n with a;
457
457
simp [e, nat.rfind_zero_none, map_id'],
458
458
congr, funext n,
459
- simp [roption .map_map, (∘)],
459
+ simp [part .map_map, (∘)],
460
460
apply map_id' (λ b, _),
461
461
cases b; refl
462
462
end
463
463
464
464
theorem rfind_opt {f : α → ℕ → option σ} (hf : computable₂ f) :
465
465
partrec (λ a, nat.rfind_opt (f a)) :=
466
- (rfind (primrec.option_is_some.to_comp.comp hf).part .to₂).bind
466
+ (rfind (primrec.option_is_some.to_comp.comp hf).partrec .to₂).bind
467
467
(of_option hf)
468
468
469
469
theorem nat_cases_right
@@ -475,14 +475,14 @@ theorem nat_cases_right
475
475
simp, cases f a; simp,
476
476
refine ext (λ b, ⟨λ H, _, λ H, _⟩),
477
477
{ rcases mem_bind_iff.1 H with ⟨c, h₁, h₂⟩, exact h₂ },
478
- { have : ∀ m, (nat.elim (roption .some (g a))
478
+ { have : ∀ m, (nat.elim (part .some (g a))
479
479
(λ y IH, IH.bind (λ _, h a n)) m).dom,
480
480
{ intro, induction m; simp [*, H.fst] },
481
481
exact ⟨⟨this n, H.fst⟩, H.snd⟩ }
482
482
end
483
483
484
484
theorem bind_decode₂_iff {f : α →. σ} : partrec f ↔
485
- nat.partrec (λ n, roption .bind (decode₂ α n) (λ a, (f a).map encode)) :=
485
+ nat.partrec (λ n, part .bind (decode₂ α n) (λ a, (f a).map encode)) :=
486
486
⟨λ hf, nat_iff.1 $ (of_option primrec.decode₂.to_comp).bind $
487
487
(map hf (computable.encode.comp snd).to₂).comp snd,
488
488
λ h, map_encode_iff.1 $ by simpa [encodek₂]
@@ -497,8 +497,8 @@ theorem vector_m_of_fn : ∀ {n} {f : fin n → α →. σ}, (∀ i, partrec (f
497
497
498
498
end partrec
499
499
500
- @[simp] theorem vector.m_of_fn_roption_some {α n} : ∀ (f : fin n → α),
501
- vector.m_of_fn (λ i, roption .some (f i)) = roption .some (vector.of_fn f) :=
500
+ @[simp] theorem vector.m_of_fn_part_some {α n} : ∀ (f : fin n → α),
501
+ vector.m_of_fn (λ i, part .some (f i)) = part .some (vector.of_fn f) :=
502
502
vector.m_of_fn_pure
503
503
504
504
namespace computable
@@ -514,13 +514,13 @@ theorem bind_decode_iff {f : α → β → option σ} : computable₂ (λ a n,
514
514
⟨λ hf, nat.partrec.of_eq
515
515
(((partrec.nat_iff.2 (nat.partrec.ppred.comp $
516
516
nat.partrec.of_primrec $ primcodable.prim β)).comp snd).bind
517
- (computable.comp hf fst).to₂.part ) $
517
+ (computable.comp hf fst).to₂.partrec₂ ) $
518
518
λ n, by simp;
519
519
cases decode α n.unpair.1 ; simp;
520
520
cases decode β n.unpair.2 ; simp,
521
521
λ hf, begin
522
522
have : partrec (λ a : α × ℕ, (encode (decode β a.2 )).cases
523
- (some option.none) (λ n, roption .map (f a.1 ) (decode β n))) :=
523
+ (some option.none) (λ n, part .map (f a.1 ) (decode β n))) :=
524
524
partrec.nat_cases_right (primrec.encdec.to_comp.comp snd)
525
525
(const none) ((of_option (computable.decode.comp snd)).map
526
526
(hf.comp (fst.comp $ fst.comp fst) snd).to₂),
@@ -536,7 +536,7 @@ theorem nat_elim
536
536
{f : α → ℕ} {g : α → σ} {h : α → ℕ × σ → σ}
537
537
(hf : computable f) (hg : computable g) (hh : computable₂ h) :
538
538
computable (λ a, (f a).elim (g a) (λ y IH, h a (y, IH))) :=
539
- (partrec.nat_elim hf hg hh.part ).of_eq $
539
+ (partrec.nat_elim hf hg hh.partrec₂ ).of_eq $
540
540
λ a, by simp; induction f a; simp *
541
541
542
542
theorem nat_cases {f : α → ℕ} {g : α → σ} {h : α → ℕ → σ}
@@ -629,15 +629,15 @@ open computable
629
629
theorem option_some_iff {f : α →. σ} :
630
630
partrec (λ a, (f a).map option.some) ↔ partrec f :=
631
631
⟨λ h, (nat.partrec.ppred.comp h).of_eq $
632
- λ n, by simp [roption .bind_assoc, bind_some_eq_map],
632
+ λ n, by simp [part .bind_assoc, bind_some_eq_map],
633
633
λ hf, hf.map (option_some.comp snd).to₂⟩
634
634
635
635
theorem option_cases_right {o : α → option β} {f : α → σ} {g : α → β →. σ}
636
636
(ho : computable o) (hf : computable f) (hg : partrec₂ g) :
637
637
@partrec _ σ _ _ (λ a, option.cases_on (o a) (some (f a)) (g a)) :=
638
- have partrec (λ (a : α), nat.cases (roption .some (f a))
639
- (λ n, roption .bind (decode β n) (g a)) (encode (o a))) :=
640
- nat_cases_right (encode_iff.2 ho) hf.part $
638
+ have partrec (λ (a : α), nat.cases (part .some (f a))
639
+ (λ n, part .bind (decode β n) (g a)) (encode (o a))) :=
640
+ nat_cases_right (encode_iff.2 ho) hf.partrec $
641
641
((@computable.decode β _).comp snd).of_option.bind
642
642
(hg.comp (fst.comp fst) snd).to₂,
643
643
this.of_eq $ λ a, by cases o a with b; simp [encodek]
@@ -649,7 +649,7 @@ have partrec (λ a, (option.cases_on
649
649
(sum.cases_on (f a) (λ b, option.none) option.some : option γ)
650
650
(some (sum.cases_on (f a) (λ b, some (g a b))
651
651
(λ c, option.none)))
652
- (λ c, (h a c).map option.some) : roption (option σ))) :=
652
+ (λ c, (h a c).map option.some) : part (option σ))) :=
653
653
option_cases_right
654
654
(sum_cases hf (const option.none).to₂ (option_some.comp snd).to₂)
655
655
(sum_cases hf (option_some.comp hg) (const option.none).to₂)
@@ -666,7 +666,7 @@ theorem sum_cases_left {f : α → β ⊕ γ} {g : α → β →. σ} {h : α
666
666
lemma fix_aux {α σ} (f : α →. σ ⊕ α) (a : α) (b : σ) :
667
667
let F : α → ℕ →. σ ⊕ α := λ a n,
668
668
n.elim (some (sum.inr a)) $ λ y IH, IH.bind $ λ s,
669
- sum.cases_on s (λ _, roption .some s) f in
669
+ sum.cases_on s (λ _, part .some s) f in
670
670
(∃ (n : ℕ), ((∃ (b' : σ), sum.inl b' ∈ F a n) ∧
671
671
∀ {m : ℕ}, m < n → (∃ (b : α), sum.inr b ∈ F a m)) ∧
672
672
sum.inl b ∈ F a n) ↔ b ∈ pfun.fix f a :=
@@ -707,13 +707,13 @@ end
707
707
theorem fix {f : α →. σ ⊕ α} (hf : partrec f) : partrec (pfun.fix f) :=
708
708
let F : α → ℕ →. σ ⊕ α := λ a n,
709
709
n.elim (some (sum.inr a)) $ λ y IH, IH.bind $ λ s,
710
- sum.cases_on s (λ _, roption .some s) f in
710
+ sum.cases_on s (λ _, part .some s) f in
711
711
have hF : partrec₂ F :=
712
- partrec.nat_elim snd (sum_inr.comp fst).part
712
+ partrec.nat_elim snd (sum_inr.comp fst).partrec
713
713
(sum_cases_right (snd.comp snd)
714
714
(snd.comp $ snd.comp fst).to₂
715
715
(hf.comp snd).to₂).to₂,
716
- let p := λ a n, @roption .map _ bool
716
+ let p := λ a n, @part .map _ bool
717
717
(λ s, sum.cases_on s (λ_, tt) (λ _, ff)) (F a n) in
718
718
have hp : partrec₂ p := hF.map ((sum_cases computable.id
719
719
(const tt).to₂ (const ff).to₂).comp snd).to₂,
0 commit comments