Skip to content
This repository was archived by the owner on Jul 24, 2024. It is now read-only.

Commit fb63cf3

Browse files
committed
chore(data/pfun): rename roption to part, split data.part off data.pfun (#8544)
1 parent 6728201 commit fb63cf3

File tree

17 files changed

+697
-679
lines changed

17 files changed

+697
-679
lines changed

src/computability/halting.lean

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ A universal partial recursive function, Rice's theorem, and the halting problem.
1818
open encodable denumerable
1919

2020
namespace nat.partrec
21-
open computable roption
21+
open computable part
2222

2323
theorem merge' {f g}
2424
(hf : nat.partrec f) (hg : nat.partrec g) :
@@ -60,7 +60,7 @@ namespace partrec
6060
variables {α : Type*} {β : Type*} {γ : Type*} {σ : Type*}
6161
variables [primcodable α] [primcodable β] [primcodable γ] [primcodable σ]
6262

63-
open computable roption nat.partrec (code) nat.partrec.code
63+
open computable part nat.partrec (code) nat.partrec.code
6464

6565
theorem merge' {f g : α →. σ}
6666
(hf : partrec f) (hg : partrec g) :
@@ -137,7 +137,7 @@ by exactI computable (λ a, to_bool (p a))
137137
/-- A recursively enumerable predicate is one which is the domain of a computable partial function.
138138
-/
139139
def re_pred {α} [primcodable α] (p : α → Prop) :=
140-
partrec (λ a, roption.assert (p a) (λ _, roption.some ()))
140+
partrec (λ a, part.assert (p a) (λ _, part.some ()))
141141

142142
theorem computable_pred.of_eq {α} [primcodable α]
143143
{p q : α → Prop}
@@ -165,8 +165,8 @@ theorem to_re {p : α → Prop} (hp : computable_pred p) : re_pred p :=
165165
begin
166166
obtain ⟨f, hf, rfl⟩ := computable_iff.1 hp,
167167
unfold re_pred,
168-
refine (partrec.cond hf (decidable.partrec.const' (roption.some ())) partrec.none).of_eq
169-
(λ n, roption.ext $ λ a, _),
168+
refine (partrec.cond hf (decidable.partrec.const' (part.some ())) partrec.none).of_eq
169+
(λ n, part.ext $ λ a, _),
170170
cases a, cases f n; simp
171171
end
172172

@@ -215,15 +215,15 @@ theorem computable_iff_re_compl_re {p : α → Prop} [decidable_pred p] :
215215
obtain ⟨k, pk, hk⟩ := partrec.merge
216216
(h₁.map (computable.const tt).to₂)
217217
(h₂.map (computable.const ff).to₂) _,
218-
{ refine partrec.of_eq pk (λ n, roption.eq_some_iff.2 _),
218+
{ refine partrec.of_eq pk (λ n, part.eq_some_iff.2 _),
219219
rw hk, simp, apply decidable.em },
220220
{ intros a x hx y hy, simp at hx hy, cases hy.1 hx.1 }
221221
end⟩⟩
222222

223223
end computable_pred
224224

225225
namespace nat
226-
open vector roption
226+
open vector part
227227

228228
/-- A simplified basis for `partrec`. -/
229229
inductive partrec' : ∀ {n}, (vector ℕ n →. ℕ) → Prop
@@ -247,7 +247,7 @@ begin
247247
exact (vector_m_of_fn (λ i, hg i)).bind (hf.comp snd) },
248248
case nat.partrec'.rfind : n f _ hf {
249249
have := ((primrec.eq.comp primrec.id (primrec.const 0)).to_comp.comp
250-
(hf.comp (vector_cons.comp snd fst))).to₂.part,
250+
(hf.comp (vector_cons.comp snd fst))).to₂.partrec₂,
251251
exact this.rfind },
252252
end
253253

@@ -274,12 +274,12 @@ protected theorem bind {n f g}
274274
refine fin.cases _ (λ i, _) i; simp *,
275275
exact prim (nat.primrec'.nth _)
276276
end)).of_eq $
277-
λ v, by simp [m_of_fn, roption.bind_assoc, pure]
277+
λ v, by simp [m_of_fn, part.bind_assoc, pure]
278278

279279
protected theorem map {n f} {g : vector ℕ (n+1) → ℕ}
280280
(hf : @partrec' n f) (hg : @partrec' (n+1) g) :
281281
@partrec' n (λ v, (f v).map (λ a, g (a ::ᵥ v))) :=
282-
by simp [(roption.bind_some_eq_map _ _).symm];
282+
by simp [(part.bind_some_eq_map _ _).symm];
283283
exact hf.bind hg
284284

285285
/-- Analogous to `nat.partrec'` for `ℕ`-valued functions, a predicate for partial recursive
@@ -312,9 +312,9 @@ theorem rfind_opt {n} {f : vector ℕ (n+1) → ℕ}
312312
(hf : @partrec' (n+1) f) :
313313
@partrec' n (λ v, nat.rfind_opt (λ a, of_nat (option ℕ) (f (a ::ᵥ v)))) :=
314314
((rfind $ (of_prim (primrec.nat_sub.comp (primrec.const 1) primrec.vector_head))
315-
.comp₁ (λ n, roption.some (1 - n)) hf)
315+
.comp₁ (λ n, part.some (1 - n)) hf)
316316
.bind ((prim nat.primrec'.pred).comp₁ nat.pred hf)).of_eq $
317-
λ v, roption.ext $ λ b, begin
317+
λ v, part.ext $ λ b, begin
318318
simp [nat.rfind_opt, -nat.mem_rfind],
319319
refine exists_congr (λ a,
320320
(and_congr (iff_of_eq _) iff.rfl).trans (and_congr_right (λ h, _))),
@@ -332,7 +332,7 @@ suffices ∀ f, nat.partrec f → @partrec' 1 (λ v, f v.head), from
332332
λ n f hf, begin
333333
let g, swap,
334334
exact (comp₁ g (this g hf) (prim nat.primrec'.encode)).of_eq
335-
(λ i, by dsimp only [g]; simp [encodek, roption.map_id']),
335+
(λ i, by dsimp only [g]; simp [encodek, part.map_id']),
336336
end,
337337
λ f hf, begin
338338
obtain ⟨c, rfl⟩ := exists_code.1 hf,

src/computability/partrec.lean

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,15 @@ import data.pfun
1212
1313
The partial recursive functions are defined similarly to the primitive
1414
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
1616
μ-recursion, which performs unbounded minimization.
1717
1818
## References
1919
2020
* [Mario Carneiro, *Formalizing computability theory via partial recursive functions*][carneiro2019]
2121
-/
2222

23-
open encodable denumerable roption
23+
open encodable denumerable part
2424

2525
local attribute [-simp] not_forall
2626

@@ -66,7 +66,7 @@ end
6666

6767
end rfind
6868

69-
def rfind (p : ℕ →. bool) : roption ℕ :=
69+
def rfind (p : ℕ →. bool) : part ℕ :=
7070
⟨_, λ h, (rfind_x p h).1
7171

7272
theorem rfind_spec {p : ℕ →. bool} {n : ℕ} (h : n ∈ rfind p) : tt ∈ p n :=
@@ -110,9 +110,9 @@ theorem rfind_zero_none
110110
(p : ℕ →. bool) (p0 : p 0 = none) : rfind p = none :=
111111
eq_none_iff.2 $ λ a h,
112112
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)
114114

115-
def rfind_opt {α} (f : ℕ → option α) : roption α :=
115+
def rfind_opt {α} (f : ℕ → option α) : part α :=
116116
(rfind (λ n, (f n).is_some)).bind (λ n, f n)
117117

118118
theorem rfind_opt_spec {α} {f : ℕ → option α} {a}
@@ -224,7 +224,7 @@ end nat
224224

225225
def partrec {α σ} [primcodable α] [primcodable σ]
226226
(f : α →. σ) := nat.partrec (λ n,
227-
roption.bind (decode α n) (λ a, (f a).map encode))
227+
part.bind (decode α n) (λ a, (f a).map encode))
228228

229229
def partrec₂ {α β σ} [primcodable α] [primcodable β] [primcodable σ]
230230
(f : α → β →. σ) := partrec (λ p : α × β, f p.1 p.2)
@@ -242,10 +242,10 @@ theorem primrec.to_comp {α σ} [primcodable α] [primcodable σ]
242242
theorem primrec₂.to_comp {α β σ} [primcodable α] [primcodable β] [primcodable σ]
243243
{f : α → β → σ} (hf : primrec₂ f) : computable₂ f := hf.to_comp
244244

245-
theorem computable.part {α σ} [primcodable α] [primcodable σ]
245+
protected theorem computable.partrec {α σ} [primcodable α] [primcodable σ]
246246
{f : α → σ} (hf : computable f) : partrec (f : α →. σ) := hf
247247

248-
theorem computable₂.part {α β σ} [primcodable α] [primcodable β] [primcodable σ]
248+
protected theorem computable₂.partrec₂ {α β σ} [primcodable α] [primcodable β] [primcodable σ]
249249
{f : α → β → σ} (hf : computable₂ f) : partrec₂ (λ a, (f a : β →. σ)) := hf
250250

251251
namespace computable
@@ -258,8 +258,8 @@ theorem of_eq {f g : α → σ} (hf : computable f) (H : ∀ n, f n = g n) : com
258258
theorem const (s : σ) : computable (λ a : α, s) :=
259259
(primrec.const _).to_comp
260260

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 β)) :=
263263
(nat.partrec.ppred.comp hf).of_eq $ λ n, begin
264264
cases decode α n with a; simp,
265265
cases f a with b; simp
@@ -337,15 +337,15 @@ theorem of_eq_tot {f : α →. σ} {g : α → σ}
337337
(hf : partrec f) (H : ∀ n, g n ∈ f n) : computable g :=
338338
hf.of_eq (λ a, eq_some_iff.2 (H a))
339339

340-
theorem none : partrec (λ a : α, @roption.none σ) :=
340+
theorem none : partrec (λ a : α, @part.none σ) :=
341341
nat.partrec.none.of_eq $ λ n, by cases decode α n; simp
342342

343-
protected theorem some : partrec (@roption.some α) := computable.id
343+
protected theorem some : partrec (@part.some α) := computable.id
344344

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) :=
346346
(of_option (const (to_option s))).of_eq (λ a, of_to_option s)
347347

348-
theorem const' (s : roption σ) : partrec (λ a : α, s) :=
348+
theorem const' (s : part σ) : partrec (λ a : α, s) :=
349349
by haveI := classical.dec s.dom; exact decidable.partrec.const' s
350350

351351
protected theorem bind {f : α →. β} {g : α → β →. σ}
@@ -357,7 +357,7 @@ protected theorem bind {f : α →. β} {g : α → β →. σ}
357357
theorem map {f : α →. β} {g : α → β → σ}
358358
(hf : partrec f) (hg : computable₂ g) : partrec (λ a, (f a).map (g a)) :=
359359
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
361361

362362
theorem to₂ {f : α × β →. σ} (hf : partrec f) : partrec₂ (λ a b, f (a, b)) :=
363363
hf.of_eq $ λ ⟨a, b⟩, rfl
@@ -456,14 +456,14 @@ theorem rfind {p : α → ℕ →. bool} (hp : partrec₂ p) :
456456
cases e : decode α n with a;
457457
simp [e, nat.rfind_zero_none, map_id'],
458458
congr, funext n,
459-
simp [roption.map_map, (∘)],
459+
simp [part.map_map, (∘)],
460460
apply map_id' (λ b, _),
461461
cases b; refl
462462
end
463463

464464
theorem rfind_opt {f : α → ℕ → option σ} (hf : computable₂ f) :
465465
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
467467
(of_option hf)
468468

469469
theorem nat_cases_right
@@ -475,14 +475,14 @@ theorem nat_cases_right
475475
simp, cases f a; simp,
476476
refine ext (λ b, ⟨λ H, _, λ H, _⟩),
477477
{ 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))
479479
(λ y IH, IH.bind (λ _, h a n)) m).dom,
480480
{ intro, induction m; simp [*, H.fst] },
481481
exact ⟨⟨this n, H.fst⟩, H.snd⟩ }
482482
end
483483

484484
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)) :=
486486
⟨λ hf, nat_iff.1 $ (of_option primrec.decode₂.to_comp).bind $
487487
(map hf (computable.encode.comp snd).to₂).comp snd,
488488
λ h, map_encode_iff.1 $ by simpa [encodek₂]
@@ -497,8 +497,8 @@ theorem vector_m_of_fn : ∀ {n} {f : fin n → α →. σ}, (∀ i, partrec (f
497497

498498
end partrec
499499

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) :=
502502
vector.m_of_fn_pure
503503

504504
namespace computable
@@ -514,13 +514,13 @@ theorem bind_decode_iff {f : α → β → option σ} : computable₂ (λ a n,
514514
⟨λ hf, nat.partrec.of_eq
515515
(((partrec.nat_iff.2 (nat.partrec.ppred.comp $
516516
nat.partrec.of_primrec $ primcodable.prim β)).comp snd).bind
517-
(computable.comp hf fst).to₂.part) $
517+
(computable.comp hf fst).to₂.partrec₂) $
518518
λ n, by simp;
519519
cases decode α n.unpair.1; simp;
520520
cases decode β n.unpair.2; simp,
521521
λ hf, begin
522522
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))) :=
524524
partrec.nat_cases_right (primrec.encdec.to_comp.comp snd)
525525
(const none) ((of_option (computable.decode.comp snd)).map
526526
(hf.comp (fst.comp $ fst.comp fst) snd).to₂),
@@ -536,7 +536,7 @@ theorem nat_elim
536536
{f : α → ℕ} {g : α → σ} {h : α → ℕ × σ → σ}
537537
(hf : computable f) (hg : computable g) (hh : computable₂ h) :
538538
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 $
540540
λ a, by simp; induction f a; simp *
541541

542542
theorem nat_cases {f : α → ℕ} {g : α → σ} {h : α → ℕ → σ}
@@ -629,15 +629,15 @@ open computable
629629
theorem option_some_iff {f : α →. σ} :
630630
partrec (λ a, (f a).map option.some) ↔ partrec f :=
631631
⟨λ 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],
633633
λ hf, hf.map (option_some.comp snd).to₂⟩
634634

635635
theorem option_cases_right {o : α → option β} {f : α → σ} {g : α → β →. σ}
636636
(ho : computable o) (hf : computable f) (hg : partrec₂ g) :
637637
@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 $
641641
((@computable.decode β _).comp snd).of_option.bind
642642
(hg.comp (fst.comp fst) snd).to₂,
643643
this.of_eq $ λ a, by cases o a with b; simp [encodek]
@@ -649,7 +649,7 @@ have partrec (λ a, (option.cases_on
649649
(sum.cases_on (f a) (λ b, option.none) option.some : option γ)
650650
(some (sum.cases_on (f a) (λ b, some (g a b))
651651
(λ c, option.none)))
652-
(λ c, (h a c).map option.some) : roption (option σ))) :=
652+
(λ c, (h a c).map option.some) : part (option σ))) :=
653653
option_cases_right
654654
(sum_cases hf (const option.none).to₂ (option_some.comp snd).to₂)
655655
(sum_cases hf (option_some.comp hg) (const option.none).to₂)
@@ -666,7 +666,7 @@ theorem sum_cases_left {f : α → β ⊕ γ} {g : α → β →. σ} {h : α
666666
lemma fix_aux {α σ} (f : α →. σ ⊕ α) (a : α) (b : σ) :
667667
let F : α → ℕ →. σ ⊕ α := λ a n,
668668
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
670670
(∃ (n : ℕ), ((∃ (b' : σ), sum.inl b' ∈ F a n) ∧
671671
∀ {m : ℕ}, m < n → (∃ (b : α), sum.inr b ∈ F a m)) ∧
672672
sum.inl b ∈ F a n) ↔ b ∈ pfun.fix f a :=
@@ -707,13 +707,13 @@ end
707707
theorem fix {f : α →. σ ⊕ α} (hf : partrec f) : partrec (pfun.fix f) :=
708708
let F : α → ℕ →. σ ⊕ α := λ a n,
709709
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
711711
have hF : partrec₂ F :=
712-
partrec.nat_elim snd (sum_inr.comp fst).part
712+
partrec.nat_elim snd (sum_inr.comp fst).partrec
713713
(sum_cases_right (snd.comp snd)
714714
(snd.comp $ snd.comp fst).to₂
715715
(hf.comp snd).to₂).to₂,
716-
let p := λ a n, @roption.map _ bool
716+
let p := λ a n, @part.map _ bool
717717
(λ s, sum.cases_on s (λ_, tt) (λ _, ff)) (F a n) in
718718
have hp : partrec₂ p := hF.map ((sum_cases computable.id
719719
(const tt).to₂ (const ff).to₂).comp snd).to₂,

src/computability/partrec_code.lean

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -494,11 +494,11 @@ def eval : code → ℕ →. ℕ
494494

495495
instance : has_mem (ℕ →. ℕ) code := ⟨λ f c, eval c = f⟩
496496

497-
@[simp] theorem eval_const : ∀ n m, eval (code.const n) m = roption.some n
497+
@[simp] theorem eval_const : ∀ n m, eval (code.const n) m = part.some n
498498
| 0 m := rfl
499499
| (n+1) m := by simp! *
500500

501-
@[simp] theorem eval_id (n) : eval code.id n = roption.some n := by simp! [(<*>)]
501+
@[simp] theorem eval_id (n) : eval code.id n = part.some n := by simp! [(<*>)]
502502

503503
@[simp] theorem eval_curry (c n x) : eval (curry c n) x = eval c (mkpair n x) :=
504504
by simp! [(<*>)]
@@ -541,7 +541,7 @@ theorem exists_code {f : ℕ →. ℕ} : nat.partrec f ↔ ∃ c : code, eval c
541541
case nat.partrec.rfind : f pf hf {
542542
rcases hf with ⟨cf, rfl⟩,
543543
refine ⟨comp (rfind' cf) (pair code.id zero), _⟩,
544-
simp [eval, (<*>), pure, pfun.pure, roption.map_id'] },
544+
simp [eval, (<*>), pure, pfun.pure, part.map_id'] },
545545
end, λ h, begin
546546
rcases h with ⟨c, rfl⟩, induction c,
547547
case nat.partrec.code.zero { exact nat.partrec.zero },
@@ -893,7 +893,7 @@ open partrec computable
893893

894894
theorem eval_eq_rfind_opt (c n) :
895895
eval c n = nat.rfind_opt (λ k, evaln k c n) :=
896-
roption.ext $ λ x, begin
896+
part.ext $ λ x, begin
897897
refine evaln_complete.trans (nat.rfind_opt_mono _).symm,
898898
intros a m n hl, apply evaln_mono hl,
899899
end
@@ -905,30 +905,30 @@ theorem eval_part : partrec₂ eval :=
905905

906906
theorem fixed_point
907907
{f : code → code} (hf : computable f) : ∃ c : code, eval (f c) = eval c :=
908-
let g (x y : ℕ) : roption ℕ :=
908+
let g (x y : ℕ) : part ℕ :=
909909
eval (of_nat code x) x >>= λ b, eval (of_nat code b) y in
910910
have partrec₂ g :=
911911
(eval_part.comp ((computable.of_nat _).comp fst) fst).bind
912912
(eval_part.comp ((computable.of_nat _).comp snd) (snd.comp fst)).to₂,
913913
let ⟨cg, eg⟩ := exists_code.1 this in
914-
have eg' : ∀ a n, eval cg (mkpair a n) = roption.map encode (g a n) :=
914+
have eg' : ∀ a n, eval cg (mkpair a n) = part.map encode (g a n) :=
915915
by simp [eg],
916916
let F (x : ℕ) : code := f (curry cg x) in
917917
have computable F :=
918918
hf.comp (curry_prim.comp (primrec.const cg) primrec.id).to_comp,
919919
let ⟨cF, eF⟩ := exists_code.1 this in
920-
have eF' : eval cF (encode cF) = roption.some (encode (F (encode cF))),
920+
have eF' : eval cF (encode cF) = part.some (encode (F (encode cF))),
921921
by simp [eF],
922922
⟨curry cg (encode cF), funext (λ n,
923923
show eval (f (curry cg (encode cF))) n = eval (curry cg (encode cF)) n,
924-
by simp [eg', eF', roption.map_id', g])⟩
924+
by simp [eg', eF', part.map_id', g])⟩
925925

926926
theorem fixed_point₂
927927
{f : code → ℕ →. ℕ} (hf : partrec₂ f) : ∃ c : code, eval c = f c :=
928928
let ⟨cf, ef⟩ := exists_code.1 hf in
929929
(fixed_point (curry_prim.comp
930930
(primrec.const cf) primrec.encode).to_comp).imp $
931-
λ c e, funext $ λ n, by simp [e.symm, ef, roption.map_id']
931+
λ c e, funext $ λ n, by simp [e.symm, ef, part.map_id']
932932

933933
end
934934

0 commit comments

Comments
 (0)