-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNu.pts
38 lines (28 loc) · 824 Bytes
/
Nu.pts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
language fomega;
/* greatest fixed points by co-church encoding */
module Nu;
import Cat;
import Product;
import Exists;
/* PRIMITIVES */
/* coalgebras */
Coalg (F : Functor) (A : *) : * =
Hom A (F A);
/* reusable part of Nu */
NuF (F : Functor) (X : *) = Product (Coalg F X) X;
/* greatest fixed point */
Nu (F : Functor) = Exists (NuF F);
/* unfolding a coalgebra */
unfold (F : Functor) (A : *) : Coalg F A -> Hom A (Nu F) =
lambda coalg a . pack (NuF F) A (pair (Coalg F A) A coalg a);
/* exposing one level of structure */
unroll (F : Functor) (mapF : Map F) : Hom (Nu F) (F (Nu F)) =
unpack (NuF F) (F (Nu F)) (lambda X p .
p (F (Nu F)) (lambda coalg x .
mapF X (Nu F)
(lambda x . unfold F X coalg x)
(coalg x)));
/* MODULE EXPORTS */
export Nu;
export unfold;
export unroll;