Skip to content

Commit 876d2bb

Browse files
committed
feat: add a parameter to adjust SMT encoding of literals
Fixes emina#268
1 parent edf682d commit 876d2bb

File tree

3 files changed

+49
-17
lines changed

3 files changed

+49
-17
lines changed

rosette/solver/smt/enc-lit.rkt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#lang racket/base
2+
3+
(provide current-enc-lit
4+
enc-real
5+
enc-integer)
6+
7+
(require racket/match
8+
racket/format
9+
(prefix-in $ "smtlib2.rkt")
10+
(only-in "../../base/core/bitvector.rkt" bv bitvector-size))
11+
12+
(define (enc-lit v)
13+
(match v
14+
[#t $true]
15+
[#f $false]
16+
[(? integer?) (enc-integer v)]
17+
[(? real?) (enc-real v)]
18+
[(bv lit t) ($bv lit (bitvector-size t))]
19+
[_ (error 'enc "expected a boolean?, integer?, real?, or bitvector?, given ~a" v)]))
20+
21+
(define current-enc-lit
22+
(make-parameter enc-lit))
23+
24+
(define-syntax-rule (enc-real v)
25+
(if (exact? v) ($/ (numerator v) (denominator v)) (string->symbol (~r v))))
26+
27+
(define-syntax-rule (enc-integer v)
28+
(let ([v* (inexact->exact v)])
29+
(if (< v* 0) ($- (abs v*)) v*)))

rosette/solver/smt/enc.rkt

Lines changed: 4 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
#lang racket
22

3-
(require "env.rkt"
4-
(prefix-in $ "smtlib2.rkt")
3+
(require "env.rkt"
4+
"enc-lit.rkt"
5+
(prefix-in $ "smtlib2.rkt")
56
(only-in "../../base/core/term.rkt" expression expression? constant? term? get-type @app)
67
(only-in "../../base/core/polymorphic.rkt" ite ite* =? guarded-test guarded-value)
78
(only-in "../../base/core/distinct.rkt" @distinct?)
@@ -74,19 +75,7 @@
7475
[_ (error 'enc "cannot encode ~a to SMT" v)]))
7576

7677
(define (enc-lit v env quantified)
77-
(match v
78-
[#t $true]
79-
[#f $false]
80-
[(? integer?) (enc-integer v)]
81-
[(? real?) (enc-real v)]
82-
[(bv lit t) ($bv lit (bitvector-size t))]
83-
[_ (error 'enc "expected a boolean?, integer?, real?, or bitvector?, given ~a" v)]))
84-
85-
(define-syntax-rule (enc-real v)
86-
(if (exact? v) ($/ (numerator v) (denominator v)) (string->symbol (~r v))))
87-
(define-syntax-rule (enc-integer v)
88-
(let ([v* (inexact->exact v)])
89-
(if (< v* 0) ($- (abs v*)) v*)))
78+
((current-enc-lit) v))
9079

9180
(define-syntax define-encoder
9281
(syntax-rules ()

test/base/real.rkt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#lang racket
22

3-
(require rackunit rackunit/text-ui "common.rkt" "solver.rkt"
3+
(require rackunit rackunit/text-ui "common.rkt" "solver.rkt"
4+
rosette/solver/smt/enc-lit
45
rosette/solver/smt/z3
56
rosette/solver/solution
67
rosette/lib/roseunit
@@ -256,7 +257,19 @@
256257
(parameterize ([solver (z3 #:options (hash ':pp.decimal 'true ':pp.decimal-precision 15))])
257258
(check-= (abs ((solve (@= (@* xr xr) 2)) xr)) (abs (sqrt 2)) 1e-15)
258259
(solver-shutdown (solver))))
259-
260+
261+
(define (check-qf-nra)
262+
(parameterize ([solver (z3 #:logic 'QF_NRA)]
263+
[current-enc-lit
264+
(let ([enc-lit (current-enc-lit)])
265+
(λ (x)
266+
(cond
267+
[(real? x) (enc-real x)]
268+
[else (enc-lit x)])))])
269+
(define-symbolic x @real?)
270+
(check-pred sat? (solve (@= -2.0 x)))
271+
(solver-shutdown (solver))))
272+
260273
(define (check-division-simplifications div x y z [epsilon 0])
261274
(check-valid? (div 0 x) 0)
262275
(check-valid? (div x 1) x)
@@ -563,6 +576,7 @@
563576
(check-*-simplifications xr yr zr)
564577
(check-*-real-simplifications)
565578
(check-irrationals)
579+
(check-qf-nra)
566580
(check-semantics @* xi yi zi)
567581
(check-semantics @* xr yr zr)))
568582

0 commit comments

Comments
 (0)