rosette-util.rkt (2147B)
1 #lang rosette 2 3 (provide assert-pred 4 bitvector? 5 zero-integer? 6 positive-integer? 7 negative-integer? 8 nonnegative-integer?) 9 10 (require (only-in rosette [bitvector? concrete-bitvector?])) 11 12 ;; bitvector? : Any -> Bool 13 (define (bitvector? v) 14 (for/all ([v v]) 15 (concrete-bitvector? v))) 16 17 ;; assert-pred : A [A -> Bool] -> A 18 (define (assert-pred a pred) 19 (if (type? pred) 20 (type-cast pred a) 21 (begin 22 (assert (pred a)) 23 a))) 24 25 ;; zero-integer? : Any -> Bool 26 (define (zero-integer? x) 27 (and (integer? x) (zero? x))) 28 29 ;; positive-integer? : Any -> Bool 30 (define (positive-integer? x) 31 (and (integer? x) (positive? x))) 32 33 ;; negative-integer? : Any -> Bool 34 (define (negative-integer? x) 35 (and (integer? x) (negative? x))) 36 37 ;; nonnegative-integer? : Any -> Bool 38 (define (nonnegative-integer? x) 39 (and (integer? x) (not (negative? x)))) 40 41 (module+ test 42 (require rackunit "../tests/rosette/check-asserts.rkt") 43 (define-symbolic b1 b2 b3 boolean?) 44 45 ;; bitvector? 46 (check-true (bitvector? (if b1 (bitvector 4) (bitvector 3)))) 47 (check-false (bitvector? (if b1 "bad" 'also-bad))) 48 (check-equal? (bitvector? (if b1 (bitvector 4) "bad")) b1) 49 (check-equal? (bitvector? (if b1 "bad" (bitvector 4))) (not b1)) 50 51 (check-true (bitvector? (if b1 (bitvector 4) (if b2 (bitvector 3) (bitvector 2))))) 52 (check-false (bitvector? (if b1 "bad" (if b2 'also-bad 5)))) 53 (check-equal? (bitvector? (if b1 (bitvector 4) (if b2 "bad" (bitvector 2)))) (or b1 (not b2))) 54 (check-equal? (bitvector? (if b1 "bad" (if b2 (bitvector 4) 'also-bad))) (and (not b1) b2)) 55 56 (clear-asserts!) 57 58 ;; assert-pred with type? predicates 59 (check-equal?/asserts (assert-pred (if b1 1 #f) integer?) 1 (list b1)) 60 (check-equal?/asserts (assert-pred (if b1 1 #f) boolean?) #f (list (not b1))) 61 (check-equal?/asserts (assert-pred (if b1 (bv 3 4) "bad") (bitvector 4)) (bv 3 4) (list b1)) 62 63 ;; assert-pred with non-type? predicates 64 (check-equal?/asserts (assert-pred (if b1 1 -1) positive?) (if b1 1 -1) (list b1)) 65 (check-equal?/asserts (assert-pred (if b1 1 -1) negative?) (if b1 1 -1) (list (not b1))) 66 )