3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-25 07:13:41 +00:00
This commit is contained in:
Nikolaj Bjorner 2016-11-09 09:49:48 -08:00
commit 865c0c0109
13 changed files with 245 additions and 148 deletions

View file

@ -32,9 +32,9 @@ project(Z3 C CXX)
# Project version # Project version
################################################################################ ################################################################################
set(Z3_VERSION_MAJOR 4) set(Z3_VERSION_MAJOR 4)
set(Z3_VERSION_MINOR 4) set(Z3_VERSION_MINOR 5)
set(Z3_VERSION_PATCH 2) set(Z3_VERSION_PATCH 1)
set(Z3_VERSION_TWEAK 1) set(Z3_VERSION_TWEAK 0)
set(Z3_FULL_VERSION 0) set(Z3_FULL_VERSION 0)
set(Z3_VERSION "${Z3_VERSION_MAJOR}.${Z3_VERSION_MINOR}.${Z3_VERSION_PATCH}.${Z3_VERSION_TWEAK}") set(Z3_VERSION "${Z3_VERSION_MAJOR}.${Z3_VERSION_MINOR}.${Z3_VERSION_PATCH}.${Z3_VERSION_TWEAK}")
message(STATUS "Z3 version ${Z3_VERSION}") message(STATUS "Z3 version ${Z3_VERSION}")

View file

@ -1,4 +1,30 @@
# Copyright (c) Microsoft Corporation 2015 # Copyright (c) Microsoft Corporation 2015, 2016
# The Z3 Python API requires libz3.dll/.so/.dylib in the
# PATH/LD_LIBRARY_PATH/DYLD_LIBRARY_PATH
# environment variable and the PYTHON_PATH environment variable
# needs to point to the `python' directory that contains `z3/z3.py'
# (which is at bin/python in our binary releases).
# If you obtained example.py as part of our binary release zip files,
# which you unzipped into a directory called `MYZ3', then follow these
# instructions to run the example:
# Running this example on Windows:
# set PATH=%PATH%;MYZ3\bin
# set PYTHONPATH=MYZ3\bin\python
# python example.py
# Running this example on Linux:
# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:MYZ3/bin
# export PYTHONPATH=MYZ3/bin/python
# python example.py
# Running this example on OSX:
# export DYLD_LIBRARY_PATH=$DYLD_LIBRARY_PATH:MYZ3/bin
# export PYTHONPATH=MYZ3/bin/python
# python example.py
from z3 import * from z3 import *

View file

@ -9,7 +9,7 @@ from mk_util import *
# Z3 Project definition # Z3 Project definition
def init_project_def(): def init_project_def():
set_version(4, 4, 2, 1) set_version(4, 5, 1, 0)
add_lib('util', []) add_lib('util', [])
add_lib('polynomial', ['util'], 'math/polynomial') add_lib('polynomial', ['util'], 'math/polynomial')
add_lib('sat', ['util']) add_lib('sat', ['util'])
@ -94,6 +94,7 @@ def init_project_def():
add_ml_lib('ml', ['api_dll'], 'api/ml', lib_name='libz3ml') add_ml_lib('ml', ['api_dll'], 'api/ml', lib_name='libz3ml')
add_hlib('cpp', 'api/c++', includes2install=['z3++.h']) add_hlib('cpp', 'api/c++', includes2install=['z3++.h'])
set_z3py_dir('api/python') set_z3py_dir('api/python')
add_python(_libz3Component)
add_python_install(_libz3Component) add_python_install(_libz3Component)
# Examples # Examples
add_cpp_example('cpp_example', 'c++') add_cpp_example('cpp_example', 'c++')

View file

@ -26,6 +26,7 @@ DOTNET_ENABLED=True
DOTNET_KEY_FILE=None DOTNET_KEY_FILE=None
JAVA_ENABLED=True JAVA_ENABLED=True
GIT_HASH=False GIT_HASH=False
PYTHON_ENABLED=True
def set_verbose(flag): def set_verbose(flag):
global VERBOSE global VERBOSE
@ -55,6 +56,7 @@ def display_help():
print(" --nodotnet do not include .NET bindings in the binary distribution files.") print(" --nodotnet do not include .NET bindings in the binary distribution files.")
print(" --dotnet-key=<file> sign the .NET assembly with the private key in <file>.") print(" --dotnet-key=<file> sign the .NET assembly with the private key in <file>.")
print(" --nojava do not include Java bindings in the binary distribution files.") print(" --nojava do not include Java bindings in the binary distribution files.")
print(" --nopython do not include Python bindings in the binary distribution files.")
print(" --githash include git hash in the Zip file.") print(" --githash include git hash in the Zip file.")
exit(0) exit(0)
@ -69,7 +71,8 @@ def parse_options():
'nojava', 'nojava',
'nodotnet', 'nodotnet',
'dotnet-key=', 'dotnet-key=',
'githash' 'githash',
'nopython'
]) ])
for opt, arg in options: for opt, arg in options:
if opt in ('-b', '--build'): if opt in ('-b', '--build'):
@ -84,6 +87,8 @@ def parse_options():
FORCE_MK = True FORCE_MK = True
elif opt == '--nodotnet': elif opt == '--nodotnet':
DOTNET_ENABLED = False DOTNET_ENABLED = False
elif opt == '--nopython':
PYTHON_ENABLED = False
elif opt == '--dotnet-key': elif opt == '--dotnet-key':
DOTNET_KEY_FILE = arg DOTNET_KEY_FILE = arg
elif opt == '--nojava': elif opt == '--nojava':
@ -111,6 +116,8 @@ def mk_build_dir(path):
if GIT_HASH: if GIT_HASH:
opts.append('--githash=%s' % mk_util.git_hash()) opts.append('--githash=%s' % mk_util.git_hash())
opts.append('--git-describe') opts.append('--git-describe')
if PYTHON_ENABLED:
opts.append('--python')
if subprocess.call(opts) != 0: if subprocess.call(opts) != 0:
raise MKException("Failed to generate build directory at '%s'" % path) raise MKException("Failed to generate build directory at '%s'" % path)
@ -181,6 +188,7 @@ def mk_dist_dir():
mk_util.DOTNET_ENABLED = DOTNET_ENABLED mk_util.DOTNET_ENABLED = DOTNET_ENABLED
mk_util.DOTNET_KEY_FILE = DOTNET_KEY_FILE mk_util.DOTNET_KEY_FILE = DOTNET_KEY_FILE
mk_util.JAVA_ENABLED = JAVA_ENABLED mk_util.JAVA_ENABLED = JAVA_ENABLED
mk_util.PYTHON_ENABLED = PYTHON_ENABLED
mk_unix_dist(build_path, dist_path) mk_unix_dist(build_path, dist_path)
if is_verbose(): if is_verbose():
print("Generated distribution folder at '%s'" % dist_path) print("Generated distribution folder at '%s'" % dist_path)

View file

@ -63,6 +63,7 @@ DOTNET_COMPONENT='dotnet'
JAVA_COMPONENT='java' JAVA_COMPONENT='java'
ML_COMPONENT='ml' ML_COMPONENT='ml'
CPP_COMPONENT='cpp' CPP_COMPONENT='cpp'
PYTHON_COMPONENT='python'
##################### #####################
IS_WINDOWS=False IS_WINDOWS=False
IS_LINUX=False IS_LINUX=False
@ -81,6 +82,7 @@ ONLY_MAKEFILES = False
Z3PY_SRC_DIR=None Z3PY_SRC_DIR=None
VS_PROJ = False VS_PROJ = False
TRACE = False TRACE = False
PYTHON_ENABLED=False
DOTNET_ENABLED=False DOTNET_ENABLED=False
DOTNET_KEY_FILE=getenv("Z3_DOTNET_KEY_FILE", None) DOTNET_KEY_FILE=getenv("Z3_DOTNET_KEY_FILE", None)
JAVA_ENABLED=False JAVA_ENABLED=False
@ -675,7 +677,7 @@ def display_help(exit_code):
# Parse configuration option for mk_make script # Parse configuration option for mk_make script
def parse_options(): def parse_options():
global VERBOSE, DEBUG_MODE, IS_WINDOWS, VS_X64, ONLY_MAKEFILES, SHOW_CPPS, VS_PROJ, TRACE, VS_PAR, VS_PAR_NUM global VERBOSE, DEBUG_MODE, IS_WINDOWS, VS_X64, ONLY_MAKEFILES, SHOW_CPPS, VS_PROJ, TRACE, VS_PAR, VS_PAR_NUM
global DOTNET_ENABLED, DOTNET_KEY_FILE, JAVA_ENABLED, ML_ENABLED, STATIC_LIB, STATIC_BIN, PREFIX, GMP, FOCI2, FOCI2LIB, PYTHON_PACKAGE_DIR, GPROF, GIT_HASH, GIT_DESCRIBE, PYTHON_INSTALL_ENABLED global DOTNET_ENABLED, DOTNET_KEY_FILE, JAVA_ENABLED, ML_ENABLED, STATIC_LIB, STATIC_BIN, PREFIX, GMP, FOCI2, FOCI2LIB, PYTHON_PACKAGE_DIR, GPROF, GIT_HASH, GIT_DESCRIBE, PYTHON_INSTALL_ENABLED, PYTHON_ENABLED
global LINUX_X64, SLOW_OPTIMIZE, USE_OMP global LINUX_X64, SLOW_OPTIMIZE, USE_OMP
try: try:
options, remainder = getopt.gnu_getopt(sys.argv[1:], options, remainder = getopt.gnu_getopt(sys.argv[1:],
@ -748,6 +750,7 @@ def parse_options():
elif opt in ('', '--noomp'): elif opt in ('', '--noomp'):
USE_OMP = False USE_OMP = False
elif opt in ('--python'): elif opt in ('--python'):
PYTHON_ENABLED = True
PYTHON_INSTALL_ENABLED = True PYTHON_INSTALL_ENABLED = True
else: else:
print("ERROR: Invalid command line option '%s'" % opt) print("ERROR: Invalid command line option '%s'" % opt)
@ -844,6 +847,9 @@ def is_ml_enabled():
def is_dotnet_enabled(): def is_dotnet_enabled():
return DOTNET_ENABLED return DOTNET_ENABLED
def is_python_enabled():
return PYTHON_ENABLED
def is_python_install_enabled(): def is_python_install_enabled():
return PYTHON_INSTALL_ENABLED return PYTHON_INSTALL_ENABLED
@ -1382,6 +1388,32 @@ class DLLComponent(Component):
shutil.copy('%s.a' % os.path.join(build_path, self.dll_name), shutil.copy('%s.a' % os.path.join(build_path, self.dll_name),
'%s.a' % os.path.join(dist_path, INSTALL_BIN_DIR, self.dll_name)) '%s.a' % os.path.join(dist_path, INSTALL_BIN_DIR, self.dll_name))
class PythonComponent(Component):
def __init__(self, name, libz3Component):
assert isinstance(libz3Component, DLLComponent)
global PYTHON_ENABLED
Component.__init__(self, name, None, [])
self.libz3Component = libz3Component
def main_component(self):
return False
def mk_win_dist(self, build_path, dist_path):
if not is_python_enabled():
return
src = os.path.join(build_path, 'python', 'z3')
dst = os.path.join(dist_path, INSTALL_BIN_DIR, 'python', 'z3')
if os.path.exists(dst):
shutil.rmtree(dst)
shutil.copytree(src, dst)
def mk_unix_dist(self, build_path, dist_path):
self.mk_win_dist(build_path, dist_path)
def mk_makefile(self, out):
return
class PythonInstallComponent(Component): class PythonInstallComponent(Component):
def __init__(self, name, libz3Component): def __init__(self, name, libz3Component):
assert isinstance(libz3Component, DLLComponent) assert isinstance(libz3Component, DLLComponent)
@ -1484,6 +1516,7 @@ class PythonInstallComponent(Component):
os.path.join('python', 'z3', '*.pyc'), os.path.join('python', 'z3', '*.pyc'),
os.path.join(self.pythonPkgDir,'z3'), os.path.join(self.pythonPkgDir,'z3'),
in_prefix=self.in_prefix_install) in_prefix=self.in_prefix_install)
if PYTHON_PACKAGE_DIR != distutils.sysconfig.get_python_lib(): if PYTHON_PACKAGE_DIR != distutils.sysconfig.get_python_lib():
out.write('\t@echo Z3Py was installed at \'%s\', make sure this directory is in your PYTHONPATH environment variable.' % PYTHON_PACKAGE_DIR) out.write('\t@echo Z3Py was installed at \'%s\', make sure this directory is in your PYTHONPATH environment variable.' % PYTHON_PACKAGE_DIR)
@ -2173,6 +2206,15 @@ class PythonExampleComponent(ExampleComponent):
print("Copied Z3Py example '%s' to '%s'" % (py, os.path.join(BUILD_DIR, 'python'))) print("Copied Z3Py example '%s' to '%s'" % (py, os.path.join(BUILD_DIR, 'python')))
out.write('_ex_%s: \n\n' % self.name) out.write('_ex_%s: \n\n' % self.name)
def mk_win_dist(self, build_path, dist_path):
full = os.path.join(EXAMPLE_DIR, self.path)
py = 'example.py'
shutil.copyfile(os.path.join(full, py),
os.path.join(dist_path, INSTALL_BIN_DIR, 'python', py))
def mk_unix_dist(self, build_path, dist_path):
self.mk_win_dist(build_path, dist_path)
def reg_component(name, c): def reg_component(name, c):
global _Id, _Components, _ComponentNames, _Name2Component global _Id, _Components, _ComponentNames, _Name2Component
@ -2213,6 +2255,10 @@ def add_java_dll(name, deps=[], path=None, dll_name=None, package_name=None, man
c = JavaDLLComponent(name, dll_name, package_name, manifest_file, path, deps) c = JavaDLLComponent(name, dll_name, package_name, manifest_file, path, deps)
reg_component(name, c) reg_component(name, c)
def add_python(libz3Component):
name = 'python'
reg_component(name, PythonComponent(name, libz3Component))
def add_python_install(libz3Component): def add_python_install(libz3Component):
name = 'python_install' name = 'python_install'
reg_component(name, PythonInstallComponent(name, libz3Component)) reg_component(name, PythonInstallComponent(name, libz3Component))
@ -3230,11 +3276,6 @@ def mk_vs_proj_dll(name, components):
def mk_win_dist(build_path, dist_path): def mk_win_dist(build_path, dist_path):
for c in get_components(): for c in get_components():
c.mk_win_dist(build_path, dist_path) c.mk_win_dist(build_path, dist_path)
# Add Z3Py to bin directory
print("Adding to %s\n" % dist_path)
for pyc in filter(lambda f: f.endswith('.pyc') or f.endswith('.py'), os.listdir(build_path)):
shutil.copy(os.path.join(build_path, pyc),
os.path.join(dist_path, INSTALL_BIN_DIR, pyc))
def mk_unix_dist(build_path, dist_path): def mk_unix_dist(build_path, dist_path):
for c in get_components(): for c in get_components():

View file

@ -28,6 +28,7 @@ DOTNET_ENABLED=True
DOTNET_KEY_FILE=None DOTNET_KEY_FILE=None
JAVA_ENABLED=True JAVA_ENABLED=True
GIT_HASH=False GIT_HASH=False
PYTHON_ENABLED=True
def set_verbose(flag): def set_verbose(flag):
global VERBOSE global VERBOSE
@ -60,12 +61,13 @@ def display_help():
print(" --nodotnet do not include .NET bindings in the binary distribution files.") print(" --nodotnet do not include .NET bindings in the binary distribution files.")
print(" --dotnet-key=<file> sign the .NET assembly with the private key in <file>.") print(" --dotnet-key=<file> sign the .NET assembly with the private key in <file>.")
print(" --nojava do not include Java bindings in the binary distribution files.") print(" --nojava do not include Java bindings in the binary distribution files.")
print(" --nopython do not include Python bindings in the binary distribution files.")
print(" --githash include git hash in the Zip file.") print(" --githash include git hash in the Zip file.")
exit(0) exit(0)
# Parse configuration option for mk_make script # Parse configuration option for mk_make script
def parse_options(): def parse_options():
global FORCE_MK, JAVA_ENABLED, GIT_HASH, DOTNET_ENABLED, DOTNET_KEY_FILE global FORCE_MK, JAVA_ENABLED, GIT_HASH, DOTNET_ENABLED, DOTNET_KEY_FILE, PYTHON_ENABLED
path = BUILD_DIR path = BUILD_DIR
options, remainder = getopt.gnu_getopt(sys.argv[1:], 'b:hsf', ['build=', options, remainder = getopt.gnu_getopt(sys.argv[1:], 'b:hsf', ['build=',
'help', 'help',
@ -74,7 +76,8 @@ def parse_options():
'nojava', 'nojava',
'nodotnet', 'nodotnet',
'dotnet-key=', 'dotnet-key=',
'githash' 'githash',
'nopython'
]) ])
for opt, arg in options: for opt, arg in options:
if opt in ('-b', '--build'): if opt in ('-b', '--build'):
@ -89,6 +92,8 @@ def parse_options():
FORCE_MK = True FORCE_MK = True
elif opt == '--nodotnet': elif opt == '--nodotnet':
DOTNET_ENABLED = False DOTNET_ENABLED = False
elif opt == '--nopython':
PYTHON_ENABLED = False
elif opt == '--dotnet-key': elif opt == '--dotnet-key':
DOTNET_KEY_FILE = arg DOTNET_KEY_FILE = arg
elif opt == '--nojava': elif opt == '--nojava':
@ -118,6 +123,8 @@ def mk_build_dir(path, x64):
if GIT_HASH: if GIT_HASH:
opts.append('--githash=%s' % mk_util.git_hash()) opts.append('--githash=%s' % mk_util.git_hash())
opts.append('--git-describe') opts.append('--git-describe')
if PYTHON_ENABLED:
opts.append('--python')
if subprocess.call(opts) != 0: if subprocess.call(opts) != 0:
raise MKException("Failed to generate build directory at '%s'" % path) raise MKException("Failed to generate build directory at '%s'" % path)
@ -192,6 +199,7 @@ def mk_dist_dir_core(x64):
mk_util.DOTNET_ENABLED = DOTNET_ENABLED mk_util.DOTNET_ENABLED = DOTNET_ENABLED
mk_util.DOTNET_KEY_FILE = DOTNET_KEY_FILE mk_util.DOTNET_KEY_FILE = DOTNET_KEY_FILE
mk_util.JAVA_ENABLED = JAVA_ENABLED mk_util.JAVA_ENABLED = JAVA_ENABLED
mk_util.PYTHON_ENABLED = PYTHON_ENABLED
mk_win_dist(build_path, dist_path) mk_win_dist(build_path, dist_path)
if is_verbose(): if is_verbose():
print("Generated %s distribution folder at '%s'" % (platform, dist_path)) print("Generated %s distribution folder at '%s'" % (platform, dist_path))

View file

@ -189,7 +189,7 @@ extern "C" {
Z3_CATCH_RETURN(0); Z3_CATCH_RETURN(0);
} }
Z3_sort Z3_API Z3_mk_finite_domain_sort(Z3_context c, Z3_symbol name, unsigned __int64 size) { Z3_sort Z3_API Z3_mk_finite_domain_sort(Z3_context c, Z3_symbol name, __uint64 size) {
Z3_TRY; Z3_TRY;
LOG_Z3_mk_finite_domain_sort(c, name, size); LOG_Z3_mk_finite_domain_sort(c, name, size);
RESET_ERROR_CODE(); RESET_ERROR_CODE();
@ -199,7 +199,7 @@ extern "C" {
Z3_CATCH_RETURN(0); Z3_CATCH_RETURN(0);
} }
Z3_bool Z3_API Z3_get_finite_domain_sort_size(Z3_context c, Z3_sort s, unsigned __int64 * out) { Z3_bool Z3_API Z3_get_finite_domain_sort_size(Z3_context c, Z3_sort s, __uint64 * out) {
Z3_TRY; Z3_TRY;
if (out) { if (out) {
*out = 0; *out = 0;

View file

@ -4,6 +4,7 @@ import shutil
import platform import platform
import subprocess import subprocess
import multiprocessing import multiprocessing
import re
from setuptools import setup from setuptools import setup
from distutils.errors import LibError from distutils.errors import LibError
from distutils.command.build import build as _build from distutils.command.build import build as _build
@ -43,6 +44,16 @@ def _clean_bins():
shutil.rmtree(BINS_DIR, ignore_errors=True) shutil.rmtree(BINS_DIR, ignore_errors=True)
shutil.rmtree(HEADERS_DIR, ignore_errors=True) shutil.rmtree(HEADERS_DIR, ignore_errors=True)
def _z3_version():
fn = os.path.join(SRC_DIR, 'scripts', 'mk_project.py')
if os.path.exists(fn):
with open(fn) as f:
for line in f:
n = re.match(".*set_version\((.*), (.*), (.*), (.*)\).*", line)
if not n is None:
return n.group(1) + '.' + n.group(2) + '.' + n.group(3) + '.' + n.group(4)
return "?.?.?.?"
def _configure_z3(): def _configure_z3():
# bail out early if we don't need to do this - it forces a rebuild every time otherwise # bail out early if we don't need to do this - it forces a rebuild every time otherwise
if os.path.exists(BUILD_DIR): if os.path.exists(BUILD_DIR):
@ -139,7 +150,7 @@ class sdist(_sdist):
setup( setup(
name='z3-solver', name='z3-solver',
version='4.4.2.1', version=_z3_version(),
description='an efficient SMT solver library', description='an efficient SMT solver library',
long_description='Z3 is a theorem prover from Microsoft Research with support for bitvectors, booleans, arrays, floating point numbers, strings, and other data types.\n\nFor documentation, please read http://z3prover.github.io/api/html/z3.html\n\nIn the event of technical difficulties related to configuration, compiliation, or installation, please submit issues to https://github.com/angr/angr-z3', long_description='Z3 is a theorem prover from Microsoft Research with support for bitvectors, booleans, arrays, floating point numbers, strings, and other data types.\n\nFor documentation, please read http://z3prover.github.io/api/html/z3.html\n\nIn the event of technical difficulties related to configuration, compiliation, or installation, please submit issues to https://github.com/angr/angr-z3',
author="The Z3 Theorem Prover Project", author="The Z3 Theorem Prover Project",

View file

@ -1807,7 +1807,7 @@ extern "C" {
def_API('Z3_mk_finite_domain_sort', SORT, (_in(CONTEXT), _in(SYMBOL), _in(UINT64))) def_API('Z3_mk_finite_domain_sort', SORT, (_in(CONTEXT), _in(SYMBOL), _in(UINT64)))
*/ */
Z3_sort Z3_API Z3_mk_finite_domain_sort(Z3_context c, Z3_symbol name, unsigned __int64 size); Z3_sort Z3_API Z3_mk_finite_domain_sort(Z3_context c, Z3_symbol name, __uint64 size);
/** /**
\brief Create an array type. \brief Create an array type.
@ -3143,14 +3143,14 @@ extern "C" {
/** /**
\brief Create a numeral of a int, bit-vector, or finite-domain sort. \brief Create a numeral of a int, bit-vector, or finite-domain sort.
This function can be use to create numerals that fit in a machine unsigned __int64 integer. This function can be use to create numerals that fit in a machine __uint64 integer.
It is slightly faster than #Z3_mk_numeral since it is not necessary to parse a string. It is slightly faster than #Z3_mk_numeral since it is not necessary to parse a string.
\sa Z3_mk_numeral \sa Z3_mk_numeral
def_API('Z3_mk_unsigned_int64', AST, (_in(CONTEXT), _in(UINT64), _in(SORT))) def_API('Z3_mk_unsigned_int64', AST, (_in(CONTEXT), _in(UINT64), _in(SORT)))
*/ */
Z3_ast Z3_API Z3_mk_unsigned_int64(Z3_context c, unsigned __int64 v, Z3_sort ty); Z3_ast Z3_API Z3_mk_unsigned_int64(Z3_context c, __uint64 v, Z3_sort ty);
/*@}*/ /*@}*/
@ -3722,7 +3722,7 @@ extern "C" {
def_API('Z3_get_finite_domain_sort_size', BOOL, (_in(CONTEXT), _in(SORT), _out(UINT64))) def_API('Z3_get_finite_domain_sort_size', BOOL, (_in(CONTEXT), _in(SORT), _out(UINT64)))
*/ */
Z3_bool_opt Z3_API Z3_get_finite_domain_sort_size(Z3_context c, Z3_sort s, unsigned __int64* r); Z3_bool_opt Z3_API Z3_get_finite_domain_sort_size(Z3_context c, Z3_sort s, __uint64* r);
/** /**
\brief Return the domain of the given array sort. \brief Return the domain of the given array sort.
@ -4288,7 +4288,7 @@ extern "C" {
/** /**
\brief Similar to #Z3_get_numeral_string, but only succeeds if \brief Similar to #Z3_get_numeral_string, but only succeeds if
the value can fit in a machine unsigned __int64 int. Return Z3_TRUE if the call succeeded. the value can fit in a machine __uint64 int. Return Z3_TRUE if the call succeeded.
\pre Z3_get_ast_kind(c, v) == Z3_NUMERAL_AST \pre Z3_get_ast_kind(c, v) == Z3_NUMERAL_AST
@ -4296,7 +4296,7 @@ extern "C" {
def_API('Z3_get_numeral_uint64', BOOL, (_in(CONTEXT), _in(AST), _out(UINT64))) def_API('Z3_get_numeral_uint64', BOOL, (_in(CONTEXT), _in(AST), _out(UINT64)))
*/ */
Z3_bool Z3_API Z3_get_numeral_uint64(Z3_context c, Z3_ast v, unsigned __int64* u); Z3_bool Z3_API Z3_get_numeral_uint64(Z3_context c, Z3_ast v, __uint64* u);
/** /**
\brief Similar to #Z3_get_numeral_string, but only succeeds if \brief Similar to #Z3_get_numeral_string, but only succeeds if

View file

@ -180,7 +180,8 @@ bool macro_util::is_left_simple_macro(expr * n, unsigned num_decls, app_ref & he
if (m_manager.is_eq(n) || m_manager.is_iff(n)) { if (m_manager.is_eq(n) || m_manager.is_iff(n)) {
expr * lhs = to_app(n)->get_arg(0); expr * lhs = to_app(n)->get_arg(0);
expr * rhs = to_app(n)->get_arg(1); expr * rhs = to_app(n)->get_arg(1);
if (is_macro_head(lhs, num_decls) && !is_forbidden(to_app(lhs)->get_decl()) && !occurs(to_app(lhs)->get_decl(), rhs)) { if (is_macro_head(lhs, num_decls) && !is_forbidden(to_app(lhs)->get_decl()) &&
!occurs(to_app(lhs)->get_decl(), rhs)) {
head = to_app(lhs); head = to_app(lhs);
def = rhs; def = rhs;
return true; return true;
@ -211,7 +212,8 @@ bool macro_util::is_right_simple_macro(expr * n, unsigned num_decls, app_ref & h
if (m_manager.is_eq(n) || m_manager.is_iff(n)) { if (m_manager.is_eq(n) || m_manager.is_iff(n)) {
expr * lhs = to_app(n)->get_arg(0); expr * lhs = to_app(n)->get_arg(0);
expr * rhs = to_app(n)->get_arg(1); expr * rhs = to_app(n)->get_arg(1);
if (is_macro_head(rhs, num_decls) && !is_forbidden(to_app(rhs)->get_decl()) && !occurs(to_app(rhs)->get_decl(), lhs)) { if (is_macro_head(rhs, num_decls) && !is_forbidden(to_app(rhs)->get_decl()) &&
!occurs(to_app(rhs)->get_decl(), lhs)) {
head = to_app(rhs); head = to_app(rhs);
def = lhs; def = lhs;
return true; return true;

View file

@ -1568,6 +1568,9 @@ void cmd_context::validate_model() {
// If r contains as_array/store/map/const expressions, then we do not generate the error. // If r contains as_array/store/map/const expressions, then we do not generate the error.
// TODO: improve evaluator for model expressions. // TODO: improve evaluator for model expressions.
// Note that, if "a" evaluates to false, then the error will be generated. // Note that, if "a" evaluates to false, then the error will be generated.
if (has_quantifiers(r)) {
continue;
}
try { try {
for_each_expr(contains_array, r); for_each_expr(contains_array, r);
} }

View file

@ -435,19 +435,17 @@ namespace smt {
virtual bool model_based() const { return m_fparams->m_mbqi; } virtual bool model_based() const { return m_fparams->m_mbqi; }
virtual bool mbqi_enabled(quantifier *q) const { virtual bool mbqi_enabled(quantifier *q) const {
if(!m_fparams->m_mbqi_id) return true; if (!m_fparams->m_mbqi_id) return true;
const symbol &s = q->get_qid(); const symbol &s = q->get_qid();
size_t len = strlen(m_fparams->m_mbqi_id); size_t len = strlen(m_fparams->m_mbqi_id);
if(s == symbol::null || s.is_numerical()) if (s == symbol::null || s.is_numerical())
return len == 0; return len == 0;
return strncmp(s.bare_str(),m_fparams->m_mbqi_id,len) == 0; return strncmp(s.bare_str(), m_fparams->m_mbqi_id, len) == 0;
} }
/* Quantifier id's must begin with the prefix specified by /* Quantifier id's must begin with the prefix specified by parameter
parameter mbqi.id to be instantiated with MBQI. The default mbqi.id to be instantiated with MBQI. The default value is the
value is the empty string, so all quantifiers are empty string, so all quantifiers are instantiated. */
instantiated.
*/
virtual void add(quantifier * q) { virtual void add(quantifier * q) {
if (m_fparams->m_mbqi && mbqi_enabled(q)) { if (m_fparams->m_mbqi && mbqi_enabled(q)) {
m_active = true; m_active = true;
@ -455,8 +453,7 @@ namespace smt {
} }
} }
virtual void del(quantifier * q) { virtual void del(quantifier * q) { }
}
virtual void push() { virtual void push() {
m_mam->push_scope(); m_mam->push_scope();