From 52861cf7587c5764b193859dbbcae1d02c5dab2d Mon Sep 17 00:00:00 2001 From: Sorawee Porncharoenwase Date: Tue, 5 Mar 2024 05:27:26 -0800 Subject: [PATCH] z3: bump version to 4.12.6 4.12.6 is the latest version released last week. The main motivation for the upgrade, though, is to get past 4.12.3, as subsequent versions (4.12.4 onward) support aarch64 for Linux. --- rosette/private/install.rkt | 32 +++++++++++++++----------------- rosette/solver/smt/dec.rkt | 22 ++++++++++++++++++++-- test/query/solve.rkt | 5 +++-- 3 files changed, 38 insertions(+), 21 deletions(-) diff --git a/rosette/private/install.rkt b/rosette/private/install.rkt index 5ae12314..4709ab39 100644 --- a/rosette/private/install.rkt +++ b/rosette/private/install.rkt @@ -20,7 +20,7 @@ ; far more obvious. (define z3-install-failure #f) -(define z3-version "4.8.8") +(define z3-version "4.12.6") (define (print-failure path msg) (printf "\n\n********** Failed to install Z3 **********\n\n") @@ -66,19 +66,17 @@ (not (equal? (resolve-path p) p))))) (define (get-z3-url) - ; TODO: Z3 packages a macOS aarch64 binary as of 4.8.16, so remove this special case when we update - ; to a newer Z3 version. - (if (and (equal? (system-type 'os*) 'macosx) (equal? (system-type 'arch) 'aarch64)) - (values "https://github.com/emina/rosette/releases/download/4.1/z3-4.8.8-aarch64-osx-13.3.1.zip" "z3") - (let () - (define site "https://github.com/Z3Prover/z3/releases/download") - (define-values (os exe) - (match (list (system-type 'os*) (system-type 'arch)) - ['(linux x86_64) (values "x64-ubuntu-16.04" "z3")] - [`(macosx ,_) (values "x64-osx-10.14.6" "z3")] - ['(windows x86_64) (values "x64-win" "z3.exe")] - [any (raise-user-error 'get-z3-url "No Z3 binary available for system type '~a" any)])) - (define name (format "z3-~a-~a" z3-version os)) - (values - (format "~a/z3-~a/~a.zip" site z3-version name) - (format "~a/bin/~a" name exe))))) + (define site "https://github.com/Z3Prover/z3/releases/download") + (define-values (os exe) + (match (list (system-type 'os*) (system-type 'arch)) + ['(linux x86_64) (values "x64-glibc-2.35" "z3")] + ['(linux aarch64) (values "arm64-glibc-2.35" "z3")] + ['(macosx x86_64) (values "x64-osx-11.7.10" "z3")] + ['(macosx aarch64) (values "arm64-osx-11.0" "z3")] + ['(windows x86_64) (values "x64-win" "z3.exe")] + ['(windows aarch64) (values "arm64-win" "z3.exe")] + [any (raise-user-error 'get-z3-url "No Z3 binary available for system type '~a" any)])) + (define name (format "z3-~a-~a" z3-version os)) + (values + (format "~a/z3-~a/~a.zip" site z3-version name) + (format "~a/bin/~a" name exe))) diff --git a/rosette/solver/smt/dec.rkt b/rosette/solver/smt/dec.rkt index 408d0c58..e0720c8e 100644 --- a/rosette/solver/smt/dec.rkt +++ b/rosette/solver/smt/dec.rkt @@ -23,7 +23,7 @@ ; their values, as given by sol. The env argument is assumed to be a ; dictionary from constant? to symbol?. (define (decode-model env sol) - (let ([i-sol (inline (α-rename sol) env)]) + (let ([i-sol (inline (α-rename (prune-model sol)) env)]) (for/hash ([(decl id) (in-dict env)] #:when (and (constant? decl) (hash-has-key? i-sol id))) (values decl (interpret (hash-ref i-sol id) (term-type decl)))))) @@ -72,6 +72,24 @@ ,(substitute body (for/hash ([p params] [α α-params]) (values (car p) α)))))])))) +; Given a map M from symbols to SMTLib function definitions of the form +; (define-fun id ((param type) ...) ret body), +; this procedure eliminate bindings for intermediate expressions, +; which are ids that start with "e" (e.g. "e20"), +; originally defined with define-fun (as opposed to declare-fun) in the query. +; In particular, old versions of Z3 did this pruning automatically, +; and Rosette had been working under this assumption. +; Newer versions of Z3 however included extra bindings, +; so we are pruning them away. +(define (prune-model sol) + (for/hash ([(k v) (in-immutable-hash sol)] + #:unless (match v + [`(define-fun ,(? symbol? (app symbol->string id)) ,_ ,_ ,_) + #:when (string-prefix? id "e") + #t] + [_ #f])) + (values k v))) + ; Given an s-expression B and a map M from symbols to values, ; returns a B' that replaces each occurrence of a key K in M with M[K]. (define (substitute body env) @@ -151,7 +169,7 @@ re-solve the constraints using a Z3 instance with the following options: (z3 #:options (hash ':pp.decimal 'true ':pp.decimal-precision N))" expr))] - [sym (error "Unrecognized symbol: " sym)])])])) + [sym (error 'decoder "Unrecognized symbol: ~s in ~s" sym expr)])])])) (define optable (hash '= @equal? 'ite ite diff --git a/test/query/solve.rkt b/test/query/solve.rkt index 52453739..77c995ff 100644 --- a/test/query/solve.rkt +++ b/test/query/solve.rkt @@ -65,8 +65,9 @@ (check-pred unknown? (solve - (begin (assert (> (* xi xi) 3)) - (assert (= (+ (* xr xr xr) (* xr yr)) 3.0)))))))) + (assert (forall (list xi) + (exists (list xr) + (= yi (* (- xi xr) (- xi xr))))))))))) (define regression-tests (test-suite+ "Solve regression tests."