A categorical programming language
修订版 | 6165ec9b2c325d1662942ff286c5402ca7dd473a (tree) |
---|---|
时间 | 2021-09-17 02:56:17 |
作者 | Corbin <cds@corb...> |
Commiter | Corbin |
Add Choice for Booleans.
This does not restrain the target category much; we are only saying that
Which is relatively standard for sums.
@@ -4,7 +4,7 @@ module CodeCache = Map.Make (String) | ||
4 | 4 | |
5 | 5 | let primitives = |
6 | 6 | "id comp ignore fst snd pair left right case assl assr swap dup curry \ |
7 | - uncurry app name zero succ pr nil cons map fold t f not conj disj \ | |
7 | + uncurry app name zero succ pr nil cons map fold t f not conj disj pick \ | |
8 | 8 | f-zero f-one f-negate f-add f-mul f-sqrt" |
9 | 9 | |
10 | 10 | let filter = |
@@ -0,0 +1,2 @@ | ||
1 | +(comp list/range | |
2 | + (fold nil (comp (pair (comp fst nat/is_even) (pair cons snd)) pick))) |
@@ -0,0 +1 @@ | ||
1 | +(pr (name id) (curry app)) |
@@ -14,8 +14,10 @@ | ||
14 | 14 | ; Literal s and t. |
15 | 15 | ((== expr 'conj) (== s (list 'pair '2 '2)) (== t '2)) |
16 | 16 | ((== expr 'disj) (== s (list 'pair '2 '2)) (== t '2)) |
17 | + ((== expr 'f-lt) (== s (list 'pair 'F 'F)) (== t '2)) | |
17 | 18 | ((== expr 'f-add) (== s (list 'pair 'F 'F)) (== t 'F)) |
18 | 19 | ((== expr 'f-mul) (== s (list 'pair 'F 'F)) (== t 'F)) |
20 | + ((== expr 'f-sqrt) (== s 'F) (== t (list 'sum 'F '1))) | |
19 | 21 | ; Compound before trivial. |
20 | 22 | ((== expr 'succ) (== s 'N) (== t 'N)) |
21 | 23 | ((== expr 'zero) (== s '1) (== t 'N)) |
@@ -25,12 +27,12 @@ | ||
25 | 27 | ((== expr 'f-zero) (== s '1) (== t 'F)) |
26 | 28 | ((== expr 'f-one) (== s '1) (== t 'F)) |
27 | 29 | ((== expr 'f-negate) (== s 'F) (== t 'F)) |
28 | - ((== expr 'f-sqrt) (== s 'F) (== t (list 'sum 'F '1))) | |
29 | 30 | ; Literal s, recursive t. |
30 | 31 | ((fresh (f x y) (== expr (list 'name f)) |
31 | 32 | (== s '1) (== t (list 'hom x y)) (cammyo f x y))) |
32 | 33 | ((fresh (x f) (== expr (list 'pr x f)) |
33 | 34 | (== s 'N) (cammyo x '1 t) (cammyo f t t))) |
35 | + ((== expr 'pick) (== s (list 'pair '2 (list 'pair t t)))) | |
34 | 36 | ; Parametric polymorphism with structural recursion on both sides. |
35 | 37 | ((== expr 'swap) (fresh (x y) (== s (list 'pair x y)) (== t (list 'pair y x)))) |
36 | 38 | ((== expr 'assl) |
@@ -25,6 +25,9 @@ | ||
25 | 25 | (define f (lambda (x) #f)) |
26 | 26 | (define conj (lambda (xy) (and (car xy) (cdr xy)))) |
27 | 27 | (define disj (lambda (xy) (or (car xy) (cdr xy)))) |
28 | +(define pick (lambda (bxy) | |
29 | + (let ((xy (cdr bxy))) | |
30 | + (if (car bxy) (car xy) (cdr xy))))) | |
28 | 31 | |
29 | 32 | (define zero (lambda (x) 0)) |
30 | 33 | (define succ (lambda (x) (+ x 1))) |
@@ -39,6 +42,7 @@ | ||
39 | 42 | (define f-zero (flonum 0.0)) |
40 | 43 | (define f-one (flonum 1.0)) |
41 | 44 | (define (f-negate x) (fl- x)) |
45 | +(define (f-lt xy) (fl<? (car xy) (cdr xy))) | |
42 | 46 | (define (f-add xy) (fl+ (car xy) (cdr xy))) |
43 | 47 | (define (f-mul xy) (fl* (car xy) (cdr xy))) |
44 | 48 | (define (f-sqrt x) (if (eqv? 0 (flsign-bit x)) (left (flsqrt x)) (right '()))) |