nats/e -> nat/e
This commit is contained in:
parent
68421f05dd
commit
f309685999
|
@ -121,7 +121,7 @@
|
||||||
[`any any/e]
|
[`any any/e]
|
||||||
[`number num/e]
|
[`number num/e]
|
||||||
[`string string/e]
|
[`string string/e]
|
||||||
[`natural nats/e]
|
[`natural nat/e]
|
||||||
[`integer integer/e]
|
[`integer integer/e]
|
||||||
[`real real/e]
|
[`real real/e]
|
||||||
[`boolean bool/e]
|
[`boolean bool/e]
|
||||||
|
|
|
@ -58,9 +58,9 @@
|
||||||
take/e
|
take/e
|
||||||
fold-enum
|
fold-enum
|
||||||
|
|
||||||
nats/e
|
nat/e
|
||||||
range/e
|
range/e
|
||||||
nats+/e
|
nat+/e
|
||||||
|
|
||||||
;; Base type enumerators
|
;; Base type enumerators
|
||||||
any/e
|
any/e
|
||||||
|
@ -216,14 +216,11 @@
|
||||||
|
|
||||||
(define (fin/e . args) (from-list/e (remove-duplicates args)))
|
(define (fin/e . args) (from-list/e (remove-duplicates args)))
|
||||||
|
|
||||||
(define nats/e
|
(define nat/e
|
||||||
(enum +inf.0
|
(enum +inf.0
|
||||||
identity
|
identity
|
||||||
(λ (n)
|
identity))
|
||||||
(unless (>= n 0)
|
(define int/e
|
||||||
(redex-error 'encode "Not a natural"))
|
|
||||||
n)))
|
|
||||||
(define ints/e
|
|
||||||
(enum +inf.0
|
(enum +inf.0
|
||||||
(λ (n)
|
(λ (n)
|
||||||
(if (even? n)
|
(if (even? n)
|
||||||
|
@ -785,24 +782,24 @@
|
||||||
(cond [(> low high) (redex-error 'range/e "invalid range: ~s, ~s" low high)]
|
(cond [(> low high) (redex-error 'range/e "invalid range: ~s, ~s" low high)]
|
||||||
[(infinite? high)
|
[(infinite? high)
|
||||||
(if (infinite? low)
|
(if (infinite? low)
|
||||||
ints/e
|
int/e
|
||||||
(map/e
|
(map/e
|
||||||
(λ (n)
|
(λ (n)
|
||||||
(+ n low))
|
(+ n low))
|
||||||
(λ (n)
|
(λ (n)
|
||||||
(- n low))
|
(- n low))
|
||||||
nats/e))]
|
nat/e))]
|
||||||
[(infinite? low)
|
[(infinite? low)
|
||||||
(map/e
|
(map/e
|
||||||
(λ (n)
|
(λ (n)
|
||||||
(- high n))
|
(- high n))
|
||||||
(λ (n)
|
(λ (n)
|
||||||
(+ high n))
|
(+ high n))
|
||||||
nats/e)]
|
nat/e)]
|
||||||
[else
|
[else
|
||||||
(map/e (λ (n) (+ n low))
|
(map/e (λ (n) (+ n low))
|
||||||
(λ (n) (- n low))
|
(λ (n) (- n low))
|
||||||
(take/e nats/e (+ 1 (- high low))))]))
|
(take/e nat/e (+ 1 (- high low))))]))
|
||||||
|
|
||||||
;; thunk/e : Nat or +-Inf, ( -> enum a) -> enum a
|
;; thunk/e : Nat or +-Inf, ( -> enum a) -> enum a
|
||||||
(define (thunk/e s thunk)
|
(define (thunk/e s thunk)
|
||||||
|
@ -1070,7 +1067,7 @@
|
||||||
[1 (const/e `(,bound))]
|
[1 (const/e `(,bound))]
|
||||||
[_
|
[_
|
||||||
(define smallers/e (loop (sub1 len)))
|
(define smallers/e (loop (sub1 len)))
|
||||||
(define bounded/e (take/e nats/e (add1 bound)))
|
(define bounded/e (take/e nat/e (add1 bound)))
|
||||||
(define first-max/e
|
(define first-max/e
|
||||||
(map/e
|
(map/e
|
||||||
(curry cons bound)
|
(curry cons bound)
|
||||||
|
@ -1081,7 +1078,7 @@
|
||||||
(define first-not-max/e
|
(define first-not-max/e
|
||||||
(match bound
|
(match bound
|
||||||
[0 empty/e]
|
[0 empty/e]
|
||||||
[_ (cons/e (take/e nats/e bound)
|
[_ (cons/e (take/e nat/e bound)
|
||||||
smallers/e)]))
|
smallers/e)]))
|
||||||
(define (first-max? l)
|
(define (first-max? l)
|
||||||
((first l) . = . bound))
|
((first l) . = . bound))
|
||||||
|
@ -1103,12 +1100,12 @@
|
||||||
(define layer/e (bounded-list/e k layer))
|
(define layer/e (bounded-list/e k layer))
|
||||||
(decode layer/e (n . - . smallest))))
|
(decode layer/e (n . - . smallest))))
|
||||||
|
|
||||||
(define (nats+/e n)
|
(define (nat+/e n)
|
||||||
(map/e (λ (k)
|
(map/e (λ (k)
|
||||||
(+ k n))
|
(+ k n))
|
||||||
(λ (k)
|
(λ (k)
|
||||||
(- k n))
|
(- k n))
|
||||||
nats/e))
|
nat/e))
|
||||||
|
|
||||||
;; fail/e : exn -> enum ()
|
;; fail/e : exn -> enum ()
|
||||||
;; returns an enum that calls a thunk
|
;; returns an enum that calls a thunk
|
||||||
|
@ -1124,7 +1121,7 @@
|
||||||
test
|
test
|
||||||
(require rackunit)
|
(require rackunit)
|
||||||
(provide check-bijection?
|
(provide check-bijection?
|
||||||
ints/e
|
int/e
|
||||||
find-size
|
find-size
|
||||||
list->inc-set
|
list->inc-set
|
||||||
inc-set->list)
|
inc-set->list)
|
||||||
|
@ -1180,7 +1177,7 @@
|
||||||
(define from-1/e
|
(define from-1/e
|
||||||
(map/e add1
|
(map/e add1
|
||||||
sub1
|
sub1
|
||||||
nats/e))
|
nat/e))
|
||||||
|
|
||||||
(define integer/e
|
(define integer/e
|
||||||
(disj-sum/e (cons (const/e 0) zero?)
|
(disj-sum/e (cons (const/e 0) zero?)
|
||||||
|
|
|
@ -37,7 +37,7 @@
|
||||||
(check-bijection? e)))
|
(check-bijection? e)))
|
||||||
|
|
||||||
;; map test
|
;; map test
|
||||||
(define nats+1 (nats+/e 1))
|
(define nats+1 (nat+/e 1))
|
||||||
|
|
||||||
(test-begin
|
(test-begin
|
||||||
(check-equal? (size nats+1) +inf.0)
|
(check-equal? (size nats+1) +inf.0)
|
||||||
|
@ -48,17 +48,17 @@
|
||||||
(test-begin
|
(test-begin
|
||||||
(check-exn exn:fail?
|
(check-exn exn:fail?
|
||||||
(λ ()
|
(λ ()
|
||||||
(decode nats/e -1))))
|
(decode nat/e -1))))
|
||||||
|
|
||||||
;; ints checks
|
;; ints checks
|
||||||
(test-begin
|
(test-begin
|
||||||
(check-eq? (decode ints/e 0) 0) ; 0 -> 0
|
(check-eq? (decode int/e 0) 0) ; 0 -> 0
|
||||||
(check-eq? (decode ints/e 1) 1) ; 1 -> 1
|
(check-eq? (decode int/e 1) 1) ; 1 -> 1
|
||||||
(check-eq? (decode ints/e 2) -1) ; 2 -> 1
|
(check-eq? (decode int/e 2) -1) ; 2 -> 1
|
||||||
(check-eq? (encode ints/e 0) 0)
|
(check-eq? (encode int/e 0) 0)
|
||||||
(check-eq? (encode ints/e 1) 1)
|
(check-eq? (encode int/e 1) 1)
|
||||||
(check-eq? (encode ints/e -1) 2)
|
(check-eq? (encode int/e -1) 2)
|
||||||
(check-bijection? ints/e)) ; -1 -> 2, -3 -> 4
|
(check-bijection? int/e)) ; -1 -> 2, -3 -> 4
|
||||||
|
|
||||||
;; sum tests
|
;; sum tests
|
||||||
(define evens/e
|
(define evens/e
|
||||||
|
@ -87,9 +87,9 @@
|
||||||
(cons (from-list/e '(0 1 2 3)) number?)))
|
(cons (from-list/e '(0 1 2 3)) number?)))
|
||||||
(define bool-or-nat
|
(define bool-or-nat
|
||||||
(disj-sum/e (cons bools/e boolean?)
|
(disj-sum/e (cons bools/e boolean?)
|
||||||
(cons nats/e number?)))
|
(cons nat/e number?)))
|
||||||
(define nat-or-bool
|
(define nat-or-bool
|
||||||
(disj-sum/e (cons nats/e number?)
|
(disj-sum/e (cons nat/e number?)
|
||||||
(cons bools/e boolean?)))
|
(cons bools/e boolean?)))
|
||||||
(define odd-or-even
|
(define odd-or-even
|
||||||
(disj-sum/e (cons evens/e even?)
|
(disj-sum/e (cons evens/e even?)
|
||||||
|
@ -136,7 +136,7 @@
|
||||||
(define multi-layered
|
(define multi-layered
|
||||||
(disj-sum/e (cons (take/e string/e 5) string?)
|
(disj-sum/e (cons (take/e string/e 5) string?)
|
||||||
(cons (from-list/e '(a b c d)) symbol?)
|
(cons (from-list/e '(a b c d)) symbol?)
|
||||||
(cons nats/e number?)
|
(cons nat/e number?)
|
||||||
(cons bool/e boolean?)
|
(cons bool/e boolean?)
|
||||||
(cons (many/e bool/e) list?)))
|
(cons (many/e bool/e) list?)))
|
||||||
|
|
||||||
|
@ -165,7 +165,7 @@
|
||||||
(cons (from-list/e '(0 1 2 3)) number?)))
|
(cons (from-list/e '(0 1 2 3)) number?)))
|
||||||
(define bool-or-nat
|
(define bool-or-nat
|
||||||
(disj-append/e (cons bools/e boolean?)
|
(disj-append/e (cons bools/e boolean?)
|
||||||
(cons nats/e number?)))
|
(cons nat/e number?)))
|
||||||
(check-equal? (size bool-or-num) 6)
|
(check-equal? (size bool-or-num) 6)
|
||||||
|
|
||||||
(check-equal? (decode bool-or-num 0) #t)
|
(check-equal? (decode bool-or-num 0) #t)
|
||||||
|
@ -191,9 +191,9 @@
|
||||||
(define bool*bool (cons/e bools/e bools/e))
|
(define bool*bool (cons/e bools/e bools/e))
|
||||||
(define 1*b (cons/e (const/e 1) bools/e))
|
(define 1*b (cons/e (const/e 1) bools/e))
|
||||||
(define b*1 (cons/e bools/e (const/e 1)))
|
(define b*1 (cons/e bools/e (const/e 1)))
|
||||||
(define bool*nats (cons/e bools/e nats/e))
|
(define bool*nats (cons/e bools/e nat/e))
|
||||||
(define nats*bool (cons/e nats/e bools/e))
|
(define nats*bool (cons/e nat/e bools/e))
|
||||||
(define nats*nats (cons/e nats/e nats/e))
|
(define nats*nats (cons/e nat/e nat/e))
|
||||||
(define ns-equal? (λ (ns ms)
|
(define ns-equal? (λ (ns ms)
|
||||||
(and (= (car ns)
|
(and (= (car ns)
|
||||||
(car ms))
|
(car ms))
|
||||||
|
@ -268,15 +268,15 @@
|
||||||
[expected (list->set approx)])
|
[expected (list->set approx)])
|
||||||
(equal? actual expected)))
|
(equal? actual expected)))
|
||||||
(test-begin
|
(test-begin
|
||||||
(define n*n (cantor-list/e nats/e nats/e))
|
(define n*n (cantor-list/e nat/e nat/e))
|
||||||
(check-range? n*n 0 1 '((0 0)))
|
(check-range? n*n 0 1 '((0 0)))
|
||||||
(check-range? n*n 1 3 '((0 1) (1 0)))
|
(check-range? n*n 1 3 '((0 1) (1 0)))
|
||||||
(check-range? n*n 3 6 '((0 2) (1 1) (2 0)))
|
(check-range? n*n 3 6 '((0 2) (1 1) (2 0)))
|
||||||
(check-range? n*n 6 10 '((0 3) (1 2) (2 1) (3 0)))
|
(check-range? n*n 6 10 '((0 3) (1 2) (2 1) (3 0)))
|
||||||
(check-range? n*n 10 15 '((0 4) (1 3) (2 2) (3 1) (4 0))))
|
(check-range? n*n 10 15 '((0 4) (1 3) (2 2) (3 1) (4 0))))
|
||||||
(test-begin
|
(test-begin
|
||||||
(define n*n*n (cantor-list/e nats/e nats/e nats/e))
|
(define n*n*n (cantor-list/e nat/e nat/e nat/e))
|
||||||
(define n*n*n*n (cantor-list/e nats/e nats/e nats/e nats/e))
|
(define n*n*n*n (cantor-list/e nat/e nat/e nat/e nat/e))
|
||||||
|
|
||||||
|
|
||||||
(check-range? n*n*n 0 1 '((0 0 0)))
|
(check-range? n*n*n 0 1 '((0 0 0)))
|
||||||
|
@ -287,17 +287,17 @@
|
||||||
(1 1 1))))
|
(1 1 1))))
|
||||||
|
|
||||||
(test-begin
|
(test-begin
|
||||||
(check-bijection? (cantor-vec/e string/e nats/e real/e))
|
(check-bijection? (cantor-vec/e string/e nat/e real/e))
|
||||||
(check-bijection? (cantor-list/e string/e nats/e real/e))
|
(check-bijection? (cantor-list/e string/e nat/e real/e))
|
||||||
(check-bijection? (cantor-list/e)))
|
(check-bijection? (cantor-list/e)))
|
||||||
|
|
||||||
(test-begin
|
(test-begin
|
||||||
(define n*n (box-list/e nats/e nats/e))
|
(define n*n (box-list/e nat/e nat/e))
|
||||||
(check-range? n*n 0 1 '((0 0)))
|
(check-range? n*n 0 1 '((0 0)))
|
||||||
(check-range? n*n 1 4 '((0 1) (1 0) (1 1)))
|
(check-range? n*n 1 4 '((0 1) (1 0) (1 1)))
|
||||||
(check-range? n*n 4 9 '((0 2) (1 2) (2 1) (2 0) (2 2))))
|
(check-range? n*n 4 9 '((0 2) (1 2) (2 1) (2 0) (2 2))))
|
||||||
(test-begin
|
(test-begin
|
||||||
(define n*n*n (box-list/e nats/e nats/e nats/e))
|
(define n*n*n (box-list/e nat/e nat/e nat/e))
|
||||||
|
|
||||||
(check-range? n*n*n 0 1 '((0 0 0)))
|
(check-range? n*n*n 0 1 '((0 0 0)))
|
||||||
(check-range? n*n*n 1 8 '((0 0 1) (0 1 1) (0 1 0)
|
(check-range? n*n*n 1 8 '((0 0 1) (0 1 1) (0 1 0)
|
||||||
|
@ -314,8 +314,8 @@
|
||||||
(2 2 0) (2 2 1) (2 2 2))))
|
(2 2 0) (2 2 1) (2 2 2))))
|
||||||
|
|
||||||
(test-begin
|
(test-begin
|
||||||
(check-bijection? (box-vec/e string/e nats/e real/e))
|
(check-bijection? (box-vec/e string/e nat/e real/e))
|
||||||
(check-bijection? (box-list/e string/e nats/e real/e))
|
(check-bijection? (box-list/e string/e nat/e real/e))
|
||||||
(check-bijection? (box-list/e)))
|
(check-bijection? (box-list/e)))
|
||||||
|
|
||||||
;; helper
|
;; helper
|
||||||
|
@ -323,11 +323,12 @@
|
||||||
(check-equal? (list->inc-set '(2 0 1 2)) '(2 3 5 8))
|
(check-equal? (list->inc-set '(2 0 1 2)) '(2 3 5 8))
|
||||||
(check-equal? (inc-set->list '(2 3 5 8)) '(2 0 1 2)))
|
(check-equal? (inc-set->list '(2 3 5 8)) '(2 0 1 2)))
|
||||||
|
|
||||||
|
|
||||||
;; mixed finite/infinite list/e tests
|
;; mixed finite/infinite list/e tests
|
||||||
(test-begin
|
(test-begin
|
||||||
(check-bijection? (list/e bool/e (cons/e bool/e bool/e) (fin/e 'foo 'bar 'baz)))
|
(check-bijection? (list/e bool/e (cons/e bool/e bool/e) (fin/e 'foo 'bar 'baz)))
|
||||||
(check-bijection? (list/e nats/e string/e (many/e bool/e)))
|
(check-bijection? (list/e nat/e string/e (many/e bool/e)))
|
||||||
(check-bijection? (list/e bool/e nats/e ints/e string/e (cons/e bool/e bool/e))))
|
(check-bijection? (list/e bool/e nat/e int/e string/e (cons/e bool/e bool/e))))
|
||||||
|
|
||||||
;; multi-arg map/e test
|
;; multi-arg map/e test
|
||||||
(define sums/e
|
(define sums/e
|
||||||
|
@ -343,7 +344,7 @@
|
||||||
|
|
||||||
;; dep/e tests
|
;; dep/e tests
|
||||||
(define (up-to n)
|
(define (up-to n)
|
||||||
(take/e nats/e (+ n 1)))
|
(take/e nat/e (+ n 1)))
|
||||||
|
|
||||||
(define 3-up
|
(define 3-up
|
||||||
(dep/e
|
(dep/e
|
||||||
|
@ -353,13 +354,13 @@
|
||||||
(define from-3
|
(define from-3
|
||||||
(dep/e
|
(dep/e
|
||||||
(from-list/e '(0 1 2))
|
(from-list/e '(0 1 2))
|
||||||
nats+/e))
|
nat+/e))
|
||||||
|
|
||||||
(define nats-to
|
(define nats-to
|
||||||
(dep/e nats/e up-to))
|
(dep/e nat/e up-to))
|
||||||
|
|
||||||
(define nats-up
|
(define nats-up
|
||||||
(dep/e nats/e nats+/e))
|
(dep/e nat/e nat+/e))
|
||||||
|
|
||||||
(test-begin
|
(test-begin
|
||||||
(check-equal? (size 3-up) 6)
|
(check-equal? (size 3-up) 6)
|
||||||
|
@ -421,7 +422,7 @@
|
||||||
up-to))
|
up-to))
|
||||||
|
|
||||||
(define nats-to-2
|
(define nats-to-2
|
||||||
(dep/e nats/e up-to))
|
(dep/e nat/e up-to))
|
||||||
|
|
||||||
(test-begin
|
(test-begin
|
||||||
(check-equal? (size 3-up-2) 6)
|
(check-equal? (size 3-up-2) 6)
|
||||||
|
@ -470,7 +471,7 @@
|
||||||
|
|
||||||
;; except/e test
|
;; except/e test
|
||||||
|
|
||||||
(define not-3 (except/e nats/e 3))
|
(define not-3 (except/e nat/e 3))
|
||||||
(test-begin
|
(test-begin
|
||||||
(check-equal? (decode not-3 0) 0)
|
(check-equal? (decode not-3 0) 0)
|
||||||
(check-equal? (decode not-3 3) 4)
|
(check-equal? (decode not-3 3) 4)
|
||||||
|
@ -486,7 +487,7 @@
|
||||||
|
|
||||||
;; many/e tests
|
;; many/e tests
|
||||||
(define natss
|
(define natss
|
||||||
(many/e nats/e))
|
(many/e nat/e))
|
||||||
(check-bijection? natss)
|
(check-bijection? natss)
|
||||||
|
|
||||||
(define emptys/e
|
(define emptys/e
|
||||||
|
|
Loading…
Reference in New Issue
Block a user