PySMT 0.9.7.dev333__py2.py3-none-any.whl → 0.9.7.dev346__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- pysmt/__init__.py +1 -1
- pysmt/cmd/install.py +2 -2
- pysmt/cmd/installers/base.py +10 -0
- pysmt/cmd/installers/msat.py +24 -18
- pysmt/cmd/installers/optimsat.py +1 -1
- pysmt/cmd/installers/pico.py +3 -4
- pysmt/factory.py +10 -5
- pysmt/solvers/cvcfive.py +127 -119
- pysmt/test/smtlib/parser_utils.py +12 -12
- pysmt/test/test_bdd.py +1 -1
- {PySMT-0.9.7.dev333.dist-info → pysmt-0.9.7.dev346.dist-info}/METADATA +11 -5
- {PySMT-0.9.7.dev333.dist-info → pysmt-0.9.7.dev346.dist-info}/RECORD +17 -17
- {PySMT-0.9.7.dev333.dist-info → pysmt-0.9.7.dev346.dist-info}/WHEEL +1 -1
- {PySMT-0.9.7.dev333.dist-info → pysmt-0.9.7.dev346.dist-info}/entry_points.txt +0 -1
- {PySMT-0.9.7.dev333.dist-info → pysmt-0.9.7.dev346.dist-info/licenses}/LICENSE +0 -0
- {PySMT-0.9.7.dev333.dist-info → pysmt-0.9.7.dev346.dist-info/licenses}/NOTICE +0 -0
- {PySMT-0.9.7.dev333.dist-info → pysmt-0.9.7.dev346.dist-info}/top_level.txt +0 -0
pysmt/__init__.py
CHANGED
pysmt/cmd/install.py
CHANGED
|
@@ -32,8 +32,8 @@ from pysmt import __version__ as pysmt_version
|
|
|
32
32
|
Installer = namedtuple("Installer",
|
|
33
33
|
["InstallerClass", "version", "extra_params"])
|
|
34
34
|
INSTALLERS = [
|
|
35
|
-
Installer(MSatInstaller, "5.6.
|
|
36
|
-
Installer(CVC5Installer, "1.
|
|
35
|
+
Installer(MSatInstaller, "5.6.16", {}),
|
|
36
|
+
Installer(CVC5Installer, "1.3.3", {}),
|
|
37
37
|
Installer(CVC4Installer, "1.7-prerelease",
|
|
38
38
|
{"git_version" : "391ab9df6c3fd9a3771864900c1718534c1e4666"}),
|
|
39
39
|
Installer(Z3Installer, "4.15.0", {}),
|
pysmt/cmd/installers/base.py
CHANGED
|
@@ -231,6 +231,16 @@ class SolverInstaller(object):
|
|
|
231
231
|
stderr.close()
|
|
232
232
|
|
|
233
233
|
|
|
234
|
+
@staticmethod
|
|
235
|
+
def replace_in_file(file_path, old_str, new_str):
|
|
236
|
+
"""Replaces all occurrences of old_str with new_str in the given file"""
|
|
237
|
+
with open(file_path, "r") as f:
|
|
238
|
+
content = f.read()
|
|
239
|
+
content = content.replace(old_str, new_str)
|
|
240
|
+
with open(file_path, "w") as f:
|
|
241
|
+
f.write(content)
|
|
242
|
+
|
|
243
|
+
|
|
234
244
|
@staticmethod
|
|
235
245
|
def clean_dir(path):
|
|
236
246
|
"""Empties a (possibly non-existent) directory"""
|
pysmt/cmd/installers/msat.py
CHANGED
|
@@ -34,14 +34,14 @@ class MSatInstaller(SolverInstaller):
|
|
|
34
34
|
"ext": "tar.gz"
|
|
35
35
|
}
|
|
36
36
|
if self.os_name == "windows":
|
|
37
|
+
archive_name_template = "mathsat-{version}-{os}.{ext}"
|
|
37
38
|
format["ext"] = "zip"
|
|
38
|
-
format["
|
|
39
|
-
format["os"] = "win64" if self.architecture == "x86_64" else "win32"
|
|
39
|
+
format["os"] = "win64"
|
|
40
40
|
elif self.os_name == "darwin":
|
|
41
41
|
# Since version 5.6.7 the architecture is not included in the
|
|
42
42
|
# pkg name for the OSX release as it is considered a "univeral binary"
|
|
43
43
|
archive_name_template = "mathsat-{version}-{os}.{ext}"
|
|
44
|
-
format["os"] = "
|
|
44
|
+
format["os"] = "macos"
|
|
45
45
|
|
|
46
46
|
archive_name = archive_name_template.format(**format)
|
|
47
47
|
|
|
@@ -61,19 +61,25 @@ class MSatInstaller(SolverInstaller):
|
|
|
61
61
|
if self.os_name == "windows":
|
|
62
62
|
libdir = os.path.join(self.python_bindings_dir, "../lib")
|
|
63
63
|
incdir = os.path.join(self.python_bindings_dir, "../include")
|
|
64
|
-
gmp_h_url = "https://github.com/mikand/tamer-windows-deps/raw/master/gmp/include/gmp.h"
|
|
65
|
-
mpir_dll_url = "https://github.com/Legrandin/mpir-windows-builds/blob/master/mpir-2.6.0_VS2015_%s/mpir.dll?raw=true" % self.bits
|
|
66
|
-
mpir_lib_url = "https://github.com/Legrandin/mpir-windows-builds/blob/master/mpir-2.6.0_VS2015_%s/mpir.lib?raw=true" % self.bits
|
|
67
|
-
setup_py_win_url = "https://github.com/pysmt/solvers_patches/raw/master/mathsat/setup-win.py"
|
|
68
|
-
|
|
69
|
-
SolverInstaller.do_download(gmp_h_url, os.path.join(incdir, "gmp.h"))
|
|
70
|
-
SolverInstaller.do_download(mpir_dll_url, os.path.join(libdir, "mpir.dll"))
|
|
71
|
-
SolverInstaller.do_download(mpir_lib_url, os.path.join(libdir, "mpir.lib"))
|
|
72
64
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
SolverInstaller.
|
|
65
|
+
gmp_win_url = "https://github.com/apotocki/gmp-win/releases/download/6.3.0/gmp-6.3.0.zip"
|
|
66
|
+
gmp_archive = os.path.join(self.base_dir, "gmp-6.3.0.zip")
|
|
67
|
+
gmp_dir = os.path.join(self.base_dir, "gmp-6.3.0")
|
|
68
|
+
SolverInstaller.clean_dir(gmp_dir)
|
|
69
|
+
SolverInstaller.do_download(url=gmp_win_url, file_name=gmp_archive)
|
|
70
|
+
SolverInstaller.unzip(gmp_archive, gmp_dir)
|
|
71
|
+
|
|
72
|
+
gmp_include_dir = os.path.join(self.base_dir, "gmp-6.3.0", "include")
|
|
73
|
+
gmp_lib_dir = os.path.join(self.base_dir, "gmp-6.3.0", "lib")
|
|
74
|
+
# gmp_dll_dir = os.path.join(self.base_dir, "gmp-6.3.0", "bin")
|
|
75
|
+
SolverInstaller.mv(os.path.join(gmp_include_dir, "gmp.h"), incdir)
|
|
76
|
+
SolverInstaller.mv(source=os.path.join(gmp_lib_dir, "gmpdll.lib"),
|
|
77
|
+
dest=os.path.join(libdir, "gmp.lib"))
|
|
78
|
+
|
|
79
|
+
# The MathSAT setup.py expects to link against "mpir" on Windows,
|
|
80
|
+
# but we link against "gmp", so we need to patch the setup.py
|
|
81
|
+
setup_py_path = os.path.join(self.python_bindings_dir, "setup.py")
|
|
82
|
+
SolverInstaller.replace_in_file(setup_py_path, "mpir", "gmp")
|
|
77
83
|
|
|
78
84
|
# Run setup.py to compile the bindings
|
|
79
85
|
if self.os_name in {"windows", "darwin"}:
|
|
@@ -89,11 +95,11 @@ class MSatInstaller(SolverInstaller):
|
|
|
89
95
|
pdir = self.python_bindings_dir
|
|
90
96
|
bdir = os.path.join(pdir, "build")
|
|
91
97
|
sodir = glob.glob(bdir + "/lib.*")[0]
|
|
92
|
-
libdir = os.path.join(self.python_bindings_dir, "../
|
|
98
|
+
libdir = os.path.join(self.python_bindings_dir, "../bin")
|
|
93
99
|
|
|
94
100
|
# First, we need the SWIG-generated wrapper
|
|
95
101
|
for f in os.listdir(sodir):
|
|
96
|
-
if
|
|
102
|
+
if "_mathsat" in f:
|
|
97
103
|
SolverInstaller.mv(os.path.join(sodir, f), self.bindings_dir)
|
|
98
104
|
SolverInstaller.mv(os.path.join(pdir, "mathsat.py"), self.bindings_dir)
|
|
99
105
|
|
|
@@ -103,7 +109,7 @@ class MSatInstaller(SolverInstaller):
|
|
|
103
109
|
if f.endswith(".so") or f.endswith(".dll") or f.endswith(".dylib"):
|
|
104
110
|
SolverInstaller.mv(os.path.join(libdir, f), self.bindings_dir)
|
|
105
111
|
|
|
106
|
-
# Fix issue in MathSAT 5.6.10 linking to incorrect directory on
|
|
112
|
+
# Fix issue in MathSAT 5.6.10 linking to incorrect directory on MacOS
|
|
107
113
|
if self.os_name == "darwin":
|
|
108
114
|
soname = glob.glob(self.bindings_dir + "/_mathsat*.so")[0]
|
|
109
115
|
old_path = "/Users/alb/src/release/build/libmathsat.dylib"
|
pysmt/cmd/installers/optimsat.py
CHANGED
|
@@ -37,7 +37,7 @@ class OptiMSatInstaller(SolverInstaller):
|
|
|
37
37
|
archive_name = "optimathsat-%s-%s-%s.%s" % (solver_version, os_name,
|
|
38
38
|
arch, ext)
|
|
39
39
|
|
|
40
|
-
native_link = "
|
|
40
|
+
native_link = "https://optimathsat.disi.unitn.it/releases/optimathsat-%s/{archive_name}" % solver_version
|
|
41
41
|
|
|
42
42
|
SolverInstaller.__init__(self, install_dir=install_dir,
|
|
43
43
|
bindings_dir=bindings_dir,
|
pysmt/cmd/installers/pico.py
CHANGED
|
@@ -11,9 +11,10 @@
|
|
|
11
11
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
12
|
# See the License for the specific language governing permissions and
|
|
13
13
|
# limitations under the License.
|
|
14
|
-
import
|
|
14
|
+
import os
|
|
15
15
|
import json
|
|
16
16
|
import codecs
|
|
17
|
+
import glob
|
|
17
18
|
|
|
18
19
|
import urllib.request
|
|
19
20
|
|
|
@@ -59,10 +60,8 @@ class PicoSATInstaller(SolverInstaller):
|
|
|
59
60
|
SolverInstaller.run_python("setup.py build", directory=self.extract_path)
|
|
60
61
|
|
|
61
62
|
def move(self):
|
|
62
|
-
libdir = "lib.%s-%s-%s" % (self.os_name, self.architecture,
|
|
63
|
-
self.python_version)
|
|
64
63
|
bdir = os.path.join(self.extract_path, "build")
|
|
65
|
-
sodir =
|
|
64
|
+
sodir = glob.glob(bdir + "/lib.*")[0]
|
|
66
65
|
|
|
67
66
|
for f in os.listdir(sodir):
|
|
68
67
|
if f.endswith(".so"):
|
pysmt/factory.py
CHANGED
|
@@ -321,10 +321,11 @@ class Factory(object):
|
|
|
321
321
|
from pysmt.solvers.msat import (MSatFMQuantifierEliminator,
|
|
322
322
|
MSatLWQuantifierEliminator)
|
|
323
323
|
try:
|
|
324
|
-
MSatFMQuantifierEliminator()
|
|
325
|
-
MSatLWQuantifierEliminator()
|
|
326
|
-
except:
|
|
324
|
+
MSatFMQuantifierEliminator(self.environment)
|
|
325
|
+
MSatLWQuantifierEliminator(self.environment)
|
|
326
|
+
except NotImplementedError:
|
|
327
327
|
raise SolverAPINotFound
|
|
328
|
+
|
|
328
329
|
self._all_qelims['msat_fm'] = MSatFMQuantifierEliminator
|
|
329
330
|
self._all_qelims['msat_lw'] = MSatLWQuantifierEliminator
|
|
330
331
|
except SolverAPINotFound:
|
|
@@ -335,6 +336,12 @@ class Factory(object):
|
|
|
335
336
|
MSATLibLoader("optimathsat")
|
|
336
337
|
from pysmt.optimization.optimsat import (OptiMSATFMQuantifierEliminator,
|
|
337
338
|
OptiMSATLWQuantifierEliminator)
|
|
339
|
+
try:
|
|
340
|
+
OptiMSATFMQuantifierEliminator(self.environment)
|
|
341
|
+
OptiMSATLWQuantifierEliminator(self.environment)
|
|
342
|
+
except NotImplementedError:
|
|
343
|
+
raise SolverAPINotFound
|
|
344
|
+
|
|
338
345
|
self._all_qelims['optimsat_fm'] = OptiMSATFMQuantifierEliminator
|
|
339
346
|
self._all_qelims['optimsat_lw'] = OptiMSATLWQuantifierEliminator
|
|
340
347
|
except SolverAPINotFound:
|
|
@@ -397,8 +404,6 @@ class Factory(object):
|
|
|
397
404
|
self._all_optimizers['optimsat'] = OptiMSATSolver
|
|
398
405
|
except SolverAPINotFound:
|
|
399
406
|
pass
|
|
400
|
-
except SolverAPINotFound:
|
|
401
|
-
pass
|
|
402
407
|
|
|
403
408
|
try:
|
|
404
409
|
from pysmt.optimization.yices import YicesSUAOptimizer, YicesIncrementalOptimizer
|
pysmt/solvers/cvcfive.py
CHANGED
|
@@ -15,8 +15,6 @@
|
|
|
15
15
|
# See the License for the specific language governing permissions and
|
|
16
16
|
# limitations under the License.
|
|
17
17
|
#
|
|
18
|
-
from __future__ import absolute_import
|
|
19
|
-
|
|
20
18
|
from pysmt.exceptions import SolverAPINotFound
|
|
21
19
|
|
|
22
20
|
try:
|
|
@@ -32,13 +30,13 @@ from pysmt.logics import PYSMT_LOGICS, ARRAYS_CONST_LOGICS
|
|
|
32
30
|
from pysmt.solvers.solver import Solver, Converter, SolverOptions
|
|
33
31
|
from pysmt.exceptions import (SolverReturnedUnknownResultError,
|
|
34
32
|
InternalSolverError,
|
|
35
|
-
|
|
33
|
+
PysmtValueError,
|
|
36
34
|
PysmtTypeError)
|
|
37
35
|
from pysmt.walkers import DagWalker
|
|
38
36
|
from pysmt.solvers.smtlib import SmtLibBasicSolver, SmtLibIgnoreMixin
|
|
39
37
|
from pysmt.solvers.eager import EagerModel
|
|
40
38
|
from pysmt.decorators import catch_conversion_error
|
|
41
|
-
from pysmt.constants import Fraction, is_pysmt_integer
|
|
39
|
+
from pysmt.constants import Fraction, is_pysmt_integer
|
|
42
40
|
|
|
43
41
|
|
|
44
42
|
class CVC5Options(SolverOptions):
|
|
@@ -51,43 +49,43 @@ class CVC5Options(SolverOptions):
|
|
|
51
49
|
raise PysmtValueError("'unsat_cores_mode' option not supported.")
|
|
52
50
|
|
|
53
51
|
@staticmethod
|
|
54
|
-
def _set_option(
|
|
52
|
+
def _set_option(cvc5_solver, name, value):
|
|
55
53
|
try:
|
|
56
|
-
|
|
54
|
+
cvc5_solver.setOption(name, value)
|
|
57
55
|
except:
|
|
58
56
|
raise PysmtValueError("Error setting the option '%s=%s'" % (name,value))
|
|
59
57
|
|
|
60
58
|
def __call__(self, solver):
|
|
61
59
|
if solver.logic_name == "QF_SLIA":
|
|
62
|
-
self._set_option(solver.
|
|
60
|
+
self._set_option(solver.cvc5_solver,
|
|
63
61
|
"strings-exp", "true")
|
|
64
62
|
|
|
65
|
-
self._set_option(solver.
|
|
63
|
+
self._set_option(solver.cvc5_solver,
|
|
66
64
|
"produce-models", str(self.generate_models).lower())
|
|
67
|
-
self._set_option(solver.
|
|
65
|
+
self._set_option(solver.cvc5_solver,
|
|
68
66
|
"incremental", str(self.incremental).lower())
|
|
69
67
|
if self.random_seed is not None:
|
|
70
|
-
self._set_option(solver.
|
|
68
|
+
self._set_option(solver.cvc5_solver,
|
|
71
69
|
"seed", str(self.random_seed))
|
|
72
70
|
|
|
73
|
-
# self._set_option(solver.
|
|
74
|
-
# self._set_option(solver.
|
|
75
|
-
# self._set_option(solver.
|
|
76
|
-
# self._set_option(solver.
|
|
77
|
-
# self._set_option(solver.
|
|
78
|
-
# self._set_option(solver.
|
|
79
|
-
# self._set_option(solver.
|
|
80
|
-
# self._set_option(solver.
|
|
81
|
-
# self._set_option(solver.
|
|
82
|
-
# self._set_option(solver.
|
|
83
|
-
self._set_option(solver.
|
|
84
|
-
self._set_option(solver.
|
|
71
|
+
# self._set_option(solver.cvc5_solver, "miplib-trick", "true")
|
|
72
|
+
# self._set_option(solver.cvc5_solver, "miplib-trick-subs", "4")
|
|
73
|
+
# self._set_option(solver.cvc5_solver, "use-approx", "true")
|
|
74
|
+
# self._set_option(solver.cvc5_solver, "lemmas-on-replay-failure", "true")
|
|
75
|
+
# self._set_option(solver.cvc5_solver, "replay-early-close-depth", "4")
|
|
76
|
+
# self._set_option(solver.cvc5_solver, "replay-lemma-reject-cut", "128")
|
|
77
|
+
# self._set_option(solver.cvc5_solver, "replay-reject-cut", "512")
|
|
78
|
+
# self._set_option(solver.cvc5_solver, "unconstrained-simp", "true")
|
|
79
|
+
# self._set_option(solver.cvc5_solver, "use-soi", "true")
|
|
80
|
+
# self._set_option(solver.cvc5_solver, "pb-rewrites", "true")
|
|
81
|
+
# self._set_option(solver.cvc5_solver, "ite-simp", "true")
|
|
82
|
+
# self._set_option(solver.cvc5_solver, "simp-ite-compress", "true")
|
|
85
83
|
|
|
86
|
-
#self._set_option(solver.
|
|
84
|
+
#self._set_option(solver.cvc5_solver, "nl-ext-tplanes", "true")
|
|
87
85
|
|
|
88
86
|
|
|
89
87
|
for k,v in self.solver_options.items():
|
|
90
|
-
self._set_option(solver.
|
|
88
|
+
self._set_option(solver.cvc5_solver, str(k), str(v))
|
|
91
89
|
|
|
92
90
|
# EOC CVC5Options
|
|
93
91
|
|
|
@@ -104,7 +102,7 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
104
102
|
environment=environment,
|
|
105
103
|
logic=logic,
|
|
106
104
|
**options)
|
|
107
|
-
self.
|
|
105
|
+
self.cvc5_solver = cvc5.Solver()
|
|
108
106
|
self.declarations = None
|
|
109
107
|
self.logic_name = str(logic)
|
|
110
108
|
if "t" in self.logic_name:
|
|
@@ -114,14 +112,14 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
114
112
|
self.logic_name = "QF_LRA"
|
|
115
113
|
elif self.logic_name == "BOOL":
|
|
116
114
|
self.logic_name = "LRA"
|
|
117
|
-
self.
|
|
115
|
+
self.cvc5_solver.setLogic(self.logic_name)
|
|
118
116
|
|
|
119
117
|
self.options(self)
|
|
120
118
|
|
|
121
|
-
self.converter = CVC5Converter(environment,
|
|
119
|
+
self.converter = CVC5Converter(environment, parent_solver=self)
|
|
122
120
|
|
|
123
121
|
def reset_assertions(self):
|
|
124
|
-
self.
|
|
122
|
+
self.cvc5_solver.resetAssertions()
|
|
125
123
|
|
|
126
124
|
def declare_variable(self, var):
|
|
127
125
|
raise NotImplementedError
|
|
@@ -129,7 +127,7 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
129
127
|
def add_assertion(self, formula, named=None):
|
|
130
128
|
self._assert_is_boolean(formula)
|
|
131
129
|
term = self.converter.convert(formula)
|
|
132
|
-
self.
|
|
130
|
+
self.cvc5_solver.assertFormula(term)
|
|
133
131
|
|
|
134
132
|
def get_model(self):
|
|
135
133
|
assignment = {}
|
|
@@ -143,10 +141,10 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
143
141
|
def solve(self, assumptions=None):
|
|
144
142
|
if assumptions is not None:
|
|
145
143
|
cvc5_assumptions = [self.converter.convert(a) for a in assumptions]
|
|
146
|
-
res = self.
|
|
144
|
+
res = self.cvc5_solver.checkSatAssuming(*cvc5_assumptions)
|
|
147
145
|
else:
|
|
148
146
|
try:
|
|
149
|
-
res = self.
|
|
147
|
+
res = self.cvc5_solver.checkSat()
|
|
150
148
|
except Exception as ex:
|
|
151
149
|
raise InternalSolverError(str(ex))
|
|
152
150
|
|
|
@@ -164,12 +162,12 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
164
162
|
raise NotImplementedError("The solver is not incremental")
|
|
165
163
|
|
|
166
164
|
for _ in range(levels):
|
|
167
|
-
self.
|
|
165
|
+
self.cvc5_solver.push()
|
|
168
166
|
return
|
|
169
167
|
|
|
170
168
|
def pop(self, levels=1):
|
|
171
169
|
for _ in range(levels):
|
|
172
|
-
self.
|
|
170
|
+
self.cvc5_solver.pop()
|
|
173
171
|
return
|
|
174
172
|
|
|
175
173
|
def print_model(self, name_filter=None):
|
|
@@ -185,7 +183,7 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
185
183
|
def get_value(self, item):
|
|
186
184
|
self._assert_no_function_type(item)
|
|
187
185
|
term = self.converter.convert(item)
|
|
188
|
-
cvc5_res = self.
|
|
186
|
+
cvc5_res = self.cvc5_solver.getValue(term)
|
|
189
187
|
res = self.converter.back(cvc5_res)
|
|
190
188
|
if self.environment.stc.get_type(item).is_real_type() and \
|
|
191
189
|
self.environment.stc.get_type(res).is_int_type():
|
|
@@ -193,7 +191,8 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
193
191
|
return res
|
|
194
192
|
|
|
195
193
|
def _exit(self):
|
|
196
|
-
del self.
|
|
194
|
+
del self.cvc5_solver
|
|
195
|
+
|
|
197
196
|
|
|
198
197
|
def set_option(self, name, value):
|
|
199
198
|
"""Sets an option.
|
|
@@ -202,16 +201,16 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
202
201
|
:type name: String
|
|
203
202
|
:type value: String
|
|
204
203
|
"""
|
|
205
|
-
self.
|
|
204
|
+
self.cvc5_solver.setOption(name, value)
|
|
206
205
|
|
|
207
206
|
|
|
208
207
|
|
|
209
208
|
class CVC5Converter(Converter, DagWalker):
|
|
210
209
|
|
|
211
|
-
def __init__(self, environment,
|
|
210
|
+
def __init__(self, environment, parent_solver):
|
|
212
211
|
DagWalker.__init__(self, environment)
|
|
213
212
|
|
|
214
|
-
self.
|
|
213
|
+
self.parent_solver = parent_solver
|
|
215
214
|
|
|
216
215
|
self.declared_vars = {}
|
|
217
216
|
self.backconversion = {}
|
|
@@ -219,13 +218,21 @@ class CVC5Converter(Converter, DagWalker):
|
|
|
219
218
|
self._get_type = environment.stc.get_type
|
|
220
219
|
return
|
|
221
220
|
|
|
221
|
+
@property
|
|
222
|
+
def cvc5_solver(self):
|
|
223
|
+
'''Returns the cvc5 solver instance from the parent solver.
|
|
224
|
+
This is needed because apparently cvc5.Solver cannot be aliased
|
|
225
|
+
(probably due to the wrapper) and therefore we cannot store it directly
|
|
226
|
+
in the converter.'''
|
|
227
|
+
return self.parent_solver.cvc5_solver
|
|
228
|
+
|
|
222
229
|
def declare_variable(self, var):
|
|
223
230
|
if not var.is_symbol():
|
|
224
231
|
raise PysmtTypeError("Trying to declare as a variable something "
|
|
225
232
|
"that is not a symbol: %s" % var)
|
|
226
233
|
if var.symbol_name() not in self.declared_vars:
|
|
227
234
|
cvc5_type = self._type_to_cvc5(var.symbol_type())
|
|
228
|
-
decl = self.
|
|
235
|
+
decl = self.cvc5_solver.mkConst(cvc5_type, var.symbol_name())
|
|
229
236
|
self.declared_vars[var] = decl
|
|
230
237
|
|
|
231
238
|
def back(self, expr):
|
|
@@ -260,13 +267,13 @@ class CVC5Converter(Converter, DagWalker):
|
|
|
260
267
|
return self.walk(formula)
|
|
261
268
|
|
|
262
269
|
def walk_and(self, formula, args, **kwargs):
|
|
263
|
-
return self.
|
|
270
|
+
return self.cvc5_solver.mkTerm(Kind.AND, *args)
|
|
264
271
|
|
|
265
272
|
def walk_or(self, formula, args, **kwargs):
|
|
266
|
-
return self.
|
|
273
|
+
return self.cvc5_solver.mkTerm(Kind.OR, *args)
|
|
267
274
|
|
|
268
275
|
def walk_not(self, formula, args, **kwargs):
|
|
269
|
-
return self.
|
|
276
|
+
return self.cvc5_solver.mkTerm(Kind.NOT, *args)
|
|
270
277
|
|
|
271
278
|
def walk_symbol(self, formula, args, **kwargs):
|
|
272
279
|
#pylint: disable=unused-argument
|
|
@@ -275,238 +282,239 @@ class CVC5Converter(Converter, DagWalker):
|
|
|
275
282
|
return self.declared_vars[formula]
|
|
276
283
|
|
|
277
284
|
def walk_iff(self, formula, args, **kwargs):
|
|
278
|
-
return self.
|
|
285
|
+
return self.cvc5_solver.mkTerm(Kind.EQUAL, args[0], args[1])
|
|
279
286
|
|
|
280
287
|
def walk_implies(self, formula, args, **kwargs):
|
|
281
|
-
return self.
|
|
288
|
+
return self.cvc5_solver.mkTerm(Kind.IMPLIES, args[0], args[1])
|
|
282
289
|
|
|
283
290
|
def walk_le(self, formula, args, **kwargs):
|
|
284
|
-
return self.
|
|
291
|
+
return self.cvc5_solver.mkTerm(Kind.LEQ, args[0], args[1])
|
|
285
292
|
|
|
286
293
|
def walk_lt(self, formula, args, **kwargs):
|
|
287
|
-
return self.
|
|
294
|
+
return self.cvc5_solver.mkTerm(Kind.LT, args[0], args[1])
|
|
288
295
|
|
|
289
296
|
def walk_ite(self, formula, args, **kwargs):
|
|
290
|
-
return self.
|
|
297
|
+
return self.cvc5_solver.mkTerm(Kind.ITE, args[0], args[1], args[2])
|
|
291
298
|
|
|
292
299
|
def walk_real_constant(self, formula, **kwargs):
|
|
293
300
|
frac = formula.constant_value()
|
|
294
301
|
n,d = frac.numerator, frac.denominator
|
|
295
302
|
rep = str(n) + "/" + str(d)
|
|
296
|
-
return self.
|
|
303
|
+
return self.cvc5_solver.mkReal(rep)
|
|
297
304
|
|
|
298
305
|
def walk_int_constant(self, formula, **kwargs):
|
|
299
306
|
assert is_pysmt_integer(formula.constant_value())
|
|
300
307
|
rep = str(formula.constant_value())
|
|
301
|
-
return self.
|
|
308
|
+
return self.cvc5_solver.mkInteger(rep)
|
|
302
309
|
|
|
303
310
|
def walk_bool_constant(self, formula, **kwargs):
|
|
304
|
-
return self.
|
|
311
|
+
return self.cvc5_solver.mkBoolean(formula.constant_value())
|
|
305
312
|
|
|
306
313
|
def walk_exists(self, formula, args, **kwargs):
|
|
307
314
|
(bound_formula, var_list) = \
|
|
308
315
|
self._rename_bound_variables(args[0], formula.quantifier_vars())
|
|
309
|
-
bound_vars_list = self.
|
|
310
|
-
return self.
|
|
316
|
+
bound_vars_list = self.cvc5_solver.mkTerm(Kind.VARIABLE_LIST, *var_list)
|
|
317
|
+
return self.cvc5_solver.mkTerm(Kind.EXISTS,
|
|
311
318
|
bound_vars_list,
|
|
312
319
|
bound_formula)
|
|
313
320
|
|
|
314
321
|
def walk_forall(self, formula, args, **kwargs):
|
|
315
322
|
(bound_formula, var_list) = \
|
|
316
323
|
self._rename_bound_variables(args[0], formula.quantifier_vars())
|
|
317
|
-
bound_vars_list = self.
|
|
318
|
-
return self.
|
|
324
|
+
bound_vars_list = self.cvc5_solver.mkTerm(Kind.VARIABLE_LIST, *var_list)
|
|
325
|
+
return self.cvc5_solver.mkTerm(Kind.FORALL,
|
|
319
326
|
bound_vars_list,
|
|
320
327
|
bound_formula)
|
|
321
328
|
|
|
322
329
|
def walk_plus(self, formula, args, **kwargs):
|
|
323
|
-
return self.
|
|
330
|
+
return self.cvc5_solver.mkTerm(Kind.ADD, *args)
|
|
324
331
|
|
|
325
332
|
def walk_array_store(self, formula, args, **kwargs):
|
|
326
|
-
return self.
|
|
333
|
+
return self.cvc5_solver.mkTerm(Kind.STORE, args[0], args[1], args[2])
|
|
327
334
|
|
|
328
335
|
def walk_array_select(self, formula, args, **kwargs):
|
|
329
|
-
return self.
|
|
336
|
+
return self.cvc5_solver.mkTerm(Kind.SELECT, args[0], args[1])
|
|
330
337
|
|
|
331
338
|
def walk_minus(self, formula, args, **kwargs):
|
|
332
|
-
return self.
|
|
339
|
+
return self.cvc5_solver.mkTerm(Kind.SUB, args[0], args[1])
|
|
333
340
|
|
|
334
341
|
def walk_equals(self, formula, args, **kwargs):
|
|
335
|
-
return self.
|
|
342
|
+
return self.cvc5_solver.mkTerm(Kind.EQUAL, args[0], args[1])
|
|
336
343
|
|
|
337
344
|
def walk_times(self, formula, args, **kwargs):
|
|
338
|
-
return self.
|
|
345
|
+
return self.cvc5_solver.mkTerm(Kind.MULT, *args)
|
|
339
346
|
|
|
340
347
|
def walk_div(self, formula, args, **kwargs):
|
|
341
348
|
if self.env.stc.get_type(formula).is_int_type():
|
|
342
|
-
return self.
|
|
349
|
+
return self.cvc5_solver.mkTerm(Kind.INTS_DIVISION, *args)
|
|
343
350
|
else:
|
|
344
|
-
return self.
|
|
351
|
+
return self.cvc5_solver.mkTerm(Kind.DIVISION, *args)
|
|
345
352
|
|
|
346
353
|
def walk_pow(self, formula, args, **kwargs):
|
|
347
|
-
return self.
|
|
354
|
+
return self.cvc5_solver.mkTerm(Kind.TO_REAL,
|
|
355
|
+
self.cvc5_solver.mkTerm(Kind.POW, args[0], args[1]))
|
|
348
356
|
|
|
349
357
|
def walk_toreal(self, formula, args, **kwargs):
|
|
350
|
-
return self.
|
|
358
|
+
return self.cvc5_solver.mkTerm(Kind.TO_REAL, args[0])
|
|
351
359
|
|
|
352
360
|
def walk_function(self, formula, args, **kwargs):
|
|
353
361
|
name = formula.function_name()
|
|
354
362
|
if name not in self.declared_vars:
|
|
355
363
|
self.declare_variable(name)
|
|
356
364
|
decl = self.declared_vars[name]
|
|
357
|
-
return self.
|
|
365
|
+
return self.cvc5_solver.mkTerm(Kind.APPLY_UF, decl, *args)
|
|
358
366
|
|
|
359
367
|
def walk_bv_constant(self, formula, **kwargs):
|
|
360
368
|
v = formula.constant_value()
|
|
361
369
|
width = formula.bv_width()
|
|
362
|
-
return self.
|
|
370
|
+
return self.cvc5_solver.mkBitVector(width, str(v), 10)
|
|
363
371
|
|
|
364
372
|
def walk_bv_ult(self, formula, args, **kwargs):
|
|
365
|
-
return self.
|
|
373
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_ULT, args[0], args[1])
|
|
366
374
|
|
|
367
375
|
def walk_bv_ule(self, formula, args, **kwargs):
|
|
368
|
-
return self.
|
|
376
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_ULE, args[0], args[1])
|
|
369
377
|
|
|
370
378
|
def walk_bv_concat(self, formula, args, **kwargs):
|
|
371
|
-
return self.
|
|
379
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_CONCAT, args[0], args[1])
|
|
372
380
|
|
|
373
381
|
def walk_bv_extract(self, formula, args, **kwargs):
|
|
374
|
-
ext = self.
|
|
382
|
+
ext = self.cvc5_solver.mkOp(Kind.BITVECTOR_EXTRACT,
|
|
375
383
|
formula.bv_extract_end(),
|
|
376
384
|
formula.bv_extract_start())
|
|
377
|
-
return self.
|
|
385
|
+
return self.cvc5_solver.mkTerm(ext, args[0])
|
|
378
386
|
|
|
379
387
|
def walk_bv_or(self, formula, args, **kwargs):
|
|
380
|
-
return self.
|
|
388
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_OR, args[0], args[1])
|
|
381
389
|
|
|
382
390
|
def walk_bv_not(self, formula, args, **kwargs):
|
|
383
|
-
return self.
|
|
391
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_NOT, args[0])
|
|
384
392
|
|
|
385
393
|
def walk_bv_and(self, formula, args, **kwargs):
|
|
386
|
-
return self.
|
|
394
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_AND, args[0], args[1])
|
|
387
395
|
|
|
388
396
|
def walk_bv_xor(self, formula, args, **kwargs):
|
|
389
|
-
return self.
|
|
397
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_XOR, args[0], args[1])
|
|
390
398
|
|
|
391
399
|
def walk_bv_add(self, formula, args, **kwargs):
|
|
392
|
-
return self.
|
|
400
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_ADD, *args)
|
|
393
401
|
|
|
394
402
|
def walk_bv_sub(self, formula, args, **kwargs):
|
|
395
|
-
return self.
|
|
403
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_SUB, args[0], args[1])
|
|
396
404
|
|
|
397
405
|
def walk_bv_neg(self, formula, args, **kwargs):
|
|
398
|
-
return self.
|
|
406
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_NEG, args[0])
|
|
399
407
|
|
|
400
408
|
def walk_bv_mul(self, formula, args, **kwargs):
|
|
401
|
-
return self.
|
|
409
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_MULT, args[0], args[1])
|
|
402
410
|
|
|
403
411
|
def walk_bv_tonatural(self, formula, args, **kwargs):
|
|
404
|
-
return self.
|
|
412
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_TO_NAT, args[0])
|
|
405
413
|
|
|
406
414
|
def walk_bv_udiv(self, formula, args, **kwargs):
|
|
407
|
-
return self.
|
|
415
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_UDIV, *args)
|
|
408
416
|
|
|
409
417
|
def walk_bv_urem(self, formula, args, **kwargs):
|
|
410
|
-
return self.
|
|
418
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_UREM, *args)
|
|
411
419
|
|
|
412
420
|
def walk_bv_lshl(self, formula, args, **kwargs):
|
|
413
|
-
return self.
|
|
421
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_SHL, args[0], args[1])
|
|
414
422
|
|
|
415
423
|
def walk_bv_lshr(self, formula, args, **kwargs):
|
|
416
|
-
return self.
|
|
424
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_LSHR, args[0], args[1])
|
|
417
425
|
|
|
418
426
|
def walk_bv_rol(self, formula, args, **kwargs):
|
|
419
|
-
ext = self.
|
|
420
|
-
return self.
|
|
427
|
+
ext = self.cvc5_solver.mkOp(Kind.BITVECTOR_ROTATE_LEFT, formula.bv_rotation_step())
|
|
428
|
+
return self.cvc5_solver.mkTerm(ext, args[0])
|
|
421
429
|
|
|
422
430
|
def walk_bv_ror(self, formula, args, **kwargs):
|
|
423
|
-
ext = self.
|
|
424
|
-
return self.
|
|
431
|
+
ext = self.cvc5_solver.mkOp(Kind.BITVECTOR_ROTATE_RIGHT, formula.bv_rotation_step())
|
|
432
|
+
return self.cvc5_solver.mkTerm(ext, args[0])
|
|
425
433
|
|
|
426
434
|
def walk_bv_zext(self, formula, args, **kwargs):
|
|
427
|
-
ext = self.
|
|
428
|
-
return self.
|
|
435
|
+
ext = self.cvc5_solver.mkOp(Kind.BITVECTOR_ZERO_EXTEND, formula.bv_extend_step())
|
|
436
|
+
return self.cvc5_solver.mkTerm(ext, args[0])
|
|
429
437
|
|
|
430
438
|
def walk_bv_sext (self, formula, args, **kwargs):
|
|
431
|
-
ext = self.
|
|
432
|
-
return self.
|
|
439
|
+
ext = self.cvc5_solver.mkOp(Kind.BITVECTOR_SIGN_EXTEND, formula.bv_extend_step())
|
|
440
|
+
return self.cvc5_solver.mkTerm(ext, args[0])
|
|
433
441
|
|
|
434
442
|
def walk_bv_slt(self, formula, args, **kwargs):
|
|
435
|
-
return self.
|
|
443
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_SLT, args[0], args[1])
|
|
436
444
|
|
|
437
445
|
def walk_bv_sle(self, formula, args, **kwargs):
|
|
438
|
-
return self.
|
|
446
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_SLE, args[0], args[1])
|
|
439
447
|
|
|
440
448
|
def walk_bv_comp(self, formula, args, **kwargs):
|
|
441
|
-
return self.
|
|
449
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_COMP, args[0], args[1])
|
|
442
450
|
|
|
443
451
|
def walk_bv_sdiv(self, formula, args, **kwargs):
|
|
444
|
-
return self.
|
|
452
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_SDIV, *args)
|
|
445
453
|
|
|
446
454
|
def walk_bv_srem(self, formula, args, **kwargs):
|
|
447
|
-
return self.
|
|
455
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_SREM, *args)
|
|
448
456
|
|
|
449
457
|
def walk_bv_ashr(self, formula, args, **kwargs):
|
|
450
|
-
return self.
|
|
458
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_ASHR, args[0], args[1])
|
|
451
459
|
|
|
452
460
|
def walk_str_constant(self, formula, args, **kwargs):
|
|
453
|
-
return self.
|
|
461
|
+
return self.cvc5_solver.mkString(formula.constant_value())
|
|
454
462
|
|
|
455
463
|
def walk_str_length (self, formula, args, **kwargs):
|
|
456
|
-
return self.
|
|
464
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_LENGTH , args[0])
|
|
457
465
|
|
|
458
466
|
def walk_str_concat(self, formula, args, **kwargs):
|
|
459
|
-
return self.
|
|
467
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_CONCAT, *args)
|
|
460
468
|
|
|
461
469
|
def walk_str_contains(self, formula, args, **kwargs):
|
|
462
|
-
return self.
|
|
470
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_CONTAINS, args[0], args[1])
|
|
463
471
|
|
|
464
472
|
def walk_str_indexof(self, formula, args, **kwargs):
|
|
465
|
-
return self.
|
|
473
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_INDEXOF, args[0], args[1], args[2])
|
|
466
474
|
|
|
467
475
|
def walk_str_replace(self, formula, args, **kwargs):
|
|
468
|
-
return self.
|
|
476
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_REPLACE, args[0], args[1], args[2])
|
|
469
477
|
|
|
470
478
|
def walk_str_substr(self, formula, args, **kwargs):
|
|
471
|
-
return self.
|
|
479
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_SUBSTR, args[0], args[1], args[2])
|
|
472
480
|
|
|
473
481
|
def walk_str_prefixof(self, formula, args, **kwargs):
|
|
474
|
-
return self.
|
|
482
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_PREFIX, args[0], args[1])
|
|
475
483
|
|
|
476
484
|
def walk_str_suffixof(self, formula, args, **kwargs):
|
|
477
|
-
return self.
|
|
485
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_SUFFIX, args[0], args[1])
|
|
478
486
|
|
|
479
487
|
def walk_str_to_int(self, formula, args, **kwargs):
|
|
480
|
-
return self.
|
|
488
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_TO_INT, args[0])
|
|
481
489
|
|
|
482
490
|
def walk_int_to_str(self, formula, args, **kwargs):
|
|
483
|
-
return self.
|
|
491
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_FROM_INT, args[0])
|
|
484
492
|
|
|
485
493
|
def walk_str_charat(self, formula, args, **kwargs):
|
|
486
|
-
return self.
|
|
494
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_CHARAT, args[0], args[1])
|
|
487
495
|
|
|
488
496
|
def _type_to_cvc5(self, tp):
|
|
489
497
|
if tp.is_bool_type():
|
|
490
|
-
return self.
|
|
498
|
+
return self.cvc5_solver.getBooleanSort()
|
|
491
499
|
elif tp.is_real_type():
|
|
492
|
-
return self.
|
|
500
|
+
return self.cvc5_solver.getRealSort()
|
|
493
501
|
elif tp.is_int_type():
|
|
494
|
-
return self.
|
|
502
|
+
return self.cvc5_solver.getIntegerSort()
|
|
495
503
|
elif tp.is_function_type():
|
|
496
504
|
stps = [self._type_to_cvc5(x) for x in tp.param_types]
|
|
497
505
|
rtp = self._type_to_cvc5(tp.return_type)
|
|
498
|
-
return self.
|
|
506
|
+
return self.cvc5_solver.mkFunctionSort(stps, rtp)
|
|
499
507
|
elif tp.is_array_type():
|
|
500
508
|
# Recursively convert the types of index and elem
|
|
501
509
|
idx_cvc_type = self._type_to_cvc5(tp.index_type)
|
|
502
510
|
elem_cvc_type = self._type_to_cvc5(tp.elem_type)
|
|
503
|
-
return self.
|
|
511
|
+
return self.cvc5_solver.mkArraySort(idx_cvc_type, elem_cvc_type)
|
|
504
512
|
elif tp.is_bv_type():
|
|
505
|
-
return self.
|
|
513
|
+
return self.cvc5_solver.mkBitVectorSort(tp.width)
|
|
506
514
|
elif tp.is_string_type():
|
|
507
|
-
return self.
|
|
515
|
+
return self.cvc5_solver.getStringSort()
|
|
508
516
|
elif tp.is_custom_type():
|
|
509
|
-
return self.
|
|
517
|
+
return self.cvc5_solver.mkUninterpretedSort(str(tp))
|
|
510
518
|
else:
|
|
511
519
|
raise NotImplementedError("Unsupported type: %s" %tp)
|
|
512
520
|
|
|
@@ -539,7 +547,7 @@ class CVC5Converter(Converter, DagWalker):
|
|
|
539
547
|
Returns a tuple (new_formula, new_var_list) in which the old
|
|
540
548
|
variables have been replaced by the new variables in the list.
|
|
541
549
|
"""
|
|
542
|
-
mkBoundVar = self.
|
|
550
|
+
mkBoundVar = self.cvc5_solver.mkVar
|
|
543
551
|
new_var_list = [mkBoundVar(self._type_to_cvc5(x.symbol_type()),
|
|
544
552
|
x.symbol_name())
|
|
545
553
|
for x in variables]
|
|
@@ -52,18 +52,18 @@ def execute_script_fname(smtfile, logic, expected_result):
|
|
|
52
52
|
parser = SmtLibParser()
|
|
53
53
|
script = parser.get_script_fname(smtfile)
|
|
54
54
|
try:
|
|
55
|
-
|
|
56
|
-
generate_models=False)
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
55
|
+
with Solver(logic=logic, incremental=False,
|
|
56
|
+
generate_models=False) as solver:
|
|
57
|
+
if logic == QF_UF and type(solver).__name__ == 'CVC5Solver':
|
|
58
|
+
warnings.warn("Test (%s, %s) skipped because CVC5 can't handle QF_UF." % (logic, smtfile))
|
|
59
|
+
return
|
|
60
|
+
if logic == QF_LIA and type(solver).__name__ == 'CVC5Solver':
|
|
61
|
+
warnings.warn("Test (%s, %s) skipped because CVC5 is very slow on QF_LIA tests" % (logic, smtfile))
|
|
62
|
+
return
|
|
63
|
+
if logic == QF_UF and type(solver).__name__ == 'BoolectorSolver':
|
|
64
|
+
warnings.warn("Test (%s, %s) skipped because Boolector can't handle QF_UF." % (logic, smtfile))
|
|
65
|
+
return
|
|
66
|
+
log = script.evaluate(solver)
|
|
67
67
|
except NoSolverAvailableError:
|
|
68
68
|
raise SkipTest("No solver for logic %s." % logic)
|
|
69
69
|
except SolverReturnedUnknownResultError:
|
pysmt/test/test_bdd.py
CHANGED
|
@@ -167,7 +167,7 @@ class TestBdd(TestCase):
|
|
|
167
167
|
'dynamic_reordering':True}) as s:
|
|
168
168
|
s.add_assertion(self.big_tree)
|
|
169
169
|
self.assertTrue(s.solve())
|
|
170
|
-
self.
|
|
170
|
+
self.assertNotEqual(s.ddmanager.ReorderingStatus()[1], 0)
|
|
171
171
|
|
|
172
172
|
|
|
173
173
|
if __name__ == '__main__':
|
|
@@ -1,12 +1,20 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
2
|
Name: PySMT
|
|
3
|
-
Version: 0.9.7.
|
|
3
|
+
Version: 0.9.7.dev346
|
|
4
4
|
Summary: A solver-agnostic library for SMT Formulae manipulation and solving
|
|
5
5
|
Home-page: http://www.pysmt.org
|
|
6
6
|
Author: PySMT Team
|
|
7
7
|
Author-email: info@pysmt.org
|
|
8
8
|
License: APACHE
|
|
9
|
-
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
License-File: NOTICE
|
|
11
|
+
Dynamic: author
|
|
12
|
+
Dynamic: author-email
|
|
13
|
+
Dynamic: description
|
|
14
|
+
Dynamic: home-page
|
|
15
|
+
Dynamic: license
|
|
16
|
+
Dynamic: license-file
|
|
17
|
+
Dynamic: summary
|
|
10
18
|
|
|
11
19
|
============================================================
|
|
12
20
|
pySMT: A library for SMT formulae manipulation and solving
|
|
@@ -48,5 +56,3 @@ Wanna know more?
|
|
|
48
56
|
================
|
|
49
57
|
|
|
50
58
|
Visit http://www.pysmt.org
|
|
51
|
-
|
|
52
|
-
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
pysmt/__init__.py,sha256=
|
|
1
|
+
pysmt/__init__.py,sha256=muO5nvTTaN5smfBWY-ZDJHVY1zL6vSt0ln6uj_xWnW4,1598
|
|
2
2
|
pysmt/__main__.py,sha256=rR-MV1QtLYqtVoJyY3m5B5Iz-lua0-5o6YSB0W4lKy8,1085
|
|
3
3
|
pysmt/configuration.py,sha256=Iq_46QZ9z_jpBMk76euJWTqGEwHad2qyiEDPix5sXsA,4538
|
|
4
4
|
pysmt/constants.py,sha256=QelM9r5fGWSq8UNjjYoEJK2FaLHRr4Z9NZxzjeajEWA,5249
|
|
5
5
|
pysmt/decorators.py,sha256=DWX6JrQ0BTp-COFKeFW9szBuQzoaauqcNO18Yps2KXQ,3965
|
|
6
6
|
pysmt/environment.py,sha256=rdaxQ0uwmMPmcW4d5WnTYAyHNSCpRTgzRLaXQccG5-4,6522
|
|
7
7
|
pysmt/exceptions.py,sha256=P11C4a9CedUbHNTa1V2YJ1nfxpfUw4eH1smHCgoUYl4,5570
|
|
8
|
-
pysmt/factory.py,sha256=
|
|
8
|
+
pysmt/factory.py,sha256=zaFtDQ1elODdimIzMZ12BIOK_g02ISIAK86_guBYDYo,29420
|
|
9
9
|
pysmt/fnode.py,sha256=ZHqr09GQAmgQP7r27kpCNBbDYeeI4WFJYIsDEmHIwNA,32927
|
|
10
10
|
pysmt/formula.py,sha256=OklEfVvzYGq3S1uL9HPxcohLYxMhCCDfrQ4tsQaFGKk,44243
|
|
11
11
|
pysmt/logics.py,sha256=yJ1Yv24dVj4LlpnbspgcRT1t5e65RmvGas_bdHOGCAA,28774
|
|
@@ -22,17 +22,17 @@ pysmt/typing.py,sha256=GioU08mUxqsjFmmAYfBYj51mmJoBcFZDunc-t99QKng,17714
|
|
|
22
22
|
pysmt/utils.py,sha256=t13jG-E8kQNxG_JmS79GDy3SnBohSobwjJTjZHFf3fE,2302
|
|
23
23
|
pysmt/cmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
24
24
|
pysmt/cmd/check_version.py,sha256=FOumRpuGF1ntqm70QHJqZ6JEKeEamGMY-lp5XOqhPlo,2688
|
|
25
|
-
pysmt/cmd/install.py,sha256=
|
|
25
|
+
pysmt/cmd/install.py,sha256=DtxqsZRx_qcxLWYpCVfG-Alv774aQT0PbiXC0-aymOk,10468
|
|
26
26
|
pysmt/cmd/shell.py,sha256=7vfFcEYNBueQVeOEW7r38PdEfAdL71xby03BF7XR9ec,6112
|
|
27
27
|
pysmt/cmd/installers/__init__.py,sha256=sJiTL66cCauRGJ6axZMJzSKM8io5DTzbWHaUpggSL1Q,1255
|
|
28
|
-
pysmt/cmd/installers/base.py,sha256=
|
|
28
|
+
pysmt/cmd/installers/base.py,sha256=ajiPGGR2jGEA1ZxMqqh6S2hIPCLHyllbk40tVQeGwDk,13158
|
|
29
29
|
pysmt/cmd/installers/bdd.py,sha256=Qq8YlYAVvxUqNXjoOlH9_Lhj4cj6WEt7HuhbSiF_L6k,2539
|
|
30
30
|
pysmt/cmd/installers/btor.py,sha256=gUl_urKcWtbSYS_Vde_O7RJM0H-kRqh6hceTju-Sbcs,4995
|
|
31
31
|
pysmt/cmd/installers/cvcfive.py,sha256=vWqAm5xF7IMY0JWEeyx3_ochCqyHx0dlcZBo9QcQ-uk,1460
|
|
32
32
|
pysmt/cmd/installers/cvcfour.py,sha256=uBZkKIX4gZEMfjrhrparUSDydMcvGIGZM2Y8JYD0GzE,3916
|
|
33
|
-
pysmt/cmd/installers/msat.py,sha256=
|
|
34
|
-
pysmt/cmd/installers/optimsat.py,sha256=
|
|
35
|
-
pysmt/cmd/installers/pico.py,sha256=
|
|
33
|
+
pysmt/cmd/installers/msat.py,sha256=PnHNSbMLB99SPCkv2cuK8LyWweJVa7cOOcGvsFTgzsU,5547
|
|
34
|
+
pysmt/cmd/installers/optimsat.py,sha256=wktjIyM47noeT2A9yT1MnghDU4RiZVpVCYK3egWyLv4,3909
|
|
35
|
+
pysmt/cmd/installers/pico.py,sha256=U4sXr1oj4BJJpO5H7vB8WqJ6OEPazpYkmmXP1XWhvys,3027
|
|
36
36
|
pysmt/cmd/installers/yices.py,sha256=M99P641jqGtAWOgQpAQzt4T1KwmSClw1VDEETzsSZe0,3010
|
|
37
37
|
pysmt/cmd/installers/z3.py,sha256=5wP6O-a602-y1cuEyr22bkdWnOWHx8bIaPQ24xDtxX8,1386
|
|
38
38
|
pysmt/optimization/__init__.py,sha256=JXBHtcb4Lv-Sb8whc9JuGbRH2EBLWwtLUh3PL9HhNE8,650
|
|
@@ -54,7 +54,7 @@ pysmt/smtlib/parser/parser.py,sha256=jkxVWYKJWtB5Bct_Warif_bgQmiRfPhJNOhWFhl55Iw
|
|
|
54
54
|
pysmt/solvers/__init__.py,sha256=JXBHtcb4Lv-Sb8whc9JuGbRH2EBLWwtLUh3PL9HhNE8,650
|
|
55
55
|
pysmt/solvers/bdd.py,sha256=my3398_-8Rkqy1pluzZa7_12qsA43ARbs8-YAPqdMWs,15938
|
|
56
56
|
pysmt/solvers/btor.py,sha256=2oT1PfXSGTSTPaXQUwVy0M799slSH2FJ-3QNb3YQmGw,25953
|
|
57
|
-
pysmt/solvers/cvcfive.py,sha256=
|
|
57
|
+
pysmt/solvers/cvcfive.py,sha256=M8gnUvRDrELoLVVS_dUMcDALK047a-4A6evxiTC8Z-k,22201
|
|
58
58
|
pysmt/solvers/cvcfour.py,sha256=odWm_MAgoPlhOf6gaarZQAqQS4fN-8PH-xGIYaiErQE,24538
|
|
59
59
|
pysmt/solvers/dynmsat.py,sha256=RenEJwWD8qLWECnyq141_0qbw1GGB5uYKvzJ18_Fgbk,1917
|
|
60
60
|
pysmt/solvers/eager.py,sha256=dyUHR6hmBcqn83NR4kFVhrpfneEpb9Uz4llP1fSaYs4,3374
|
|
@@ -74,7 +74,7 @@ pysmt/test/omt_examples.py,sha256=f1DKD3dtxWEsMRFYdj_ZLMR6vezP9rSTzmb83weux0Q,95
|
|
|
74
74
|
pysmt/test/optimization_utils.py,sha256=z1z3cbfUbCeExylK1rnsiYR_NJTIUi3Z-OGH3y-7kwg,14266
|
|
75
75
|
pysmt/test/test_array.py,sha256=OypmqKf_ciigxK1X_W2b9sm0EWOA3wqH376QXt7oGCM,6237
|
|
76
76
|
pysmt/test/test_back.py,sha256=3O7XTx4WfuizjT7-yueZq6oGG-uqovkie7R3A5GklTk,3372
|
|
77
|
-
pysmt/test/test_bdd.py,sha256=
|
|
77
|
+
pysmt/test/test_bdd.py,sha256=CzOzP7CnTvhsg8KT5d8FPNSZ4uO9fI8deU1Xv8YUFIs,6194
|
|
78
78
|
pysmt/test/test_bv.py,sha256=-pnOgslpMAeK9US4f_z4CU8LK0ZmDr-yceS1u1kwgps,12284
|
|
79
79
|
pysmt/test/test_bv_simplification.py,sha256=gbXcSyjM9I9Zxlu5n43a66fW3RomarP2_DEj6IzYQTc,14637
|
|
80
80
|
pysmt/test/test_cnf.py,sha256=Kbfe6-WUv2fWXmVaxFSPi-B4hIO9AvLitZxMySCvfes,4434
|
|
@@ -117,7 +117,7 @@ pysmt/test/test_walkers.py,sha256=AKVMvEUtMBht08bE1vCMaeMtdgGa6j_weDSHz_9Br3Q,94
|
|
|
117
117
|
pysmt/test/configs/config1.ini,sha256=MAXPN6VVW-S7jpWmglMPN5a3JYgorTqKAF6cmfohMpo,224
|
|
118
118
|
pysmt/test/configs/config_bad.ini,sha256=AOiZPmUcmAjVXOd5Bp4_euaYJG8EfccBy5iKUEcbxz8,88
|
|
119
119
|
pysmt/test/smtlib/__init__.py,sha256=JXBHtcb4Lv-Sb8whc9JuGbRH2EBLWwtLUh3PL9HhNE8,650
|
|
120
|
-
pysmt/test/smtlib/parser_utils.py,sha256=
|
|
120
|
+
pysmt/test/smtlib/parser_utils.py,sha256=L3RFUy_z1yqKPhyg1fOeTtEbgi4CDwSmiune865miyo,13725
|
|
121
121
|
pysmt/test/smtlib/test_annotations.py,sha256=Zmj3xvPt10If2_2y39hqJqqXbSK_5X_qmPkLUNgjRA4,6296
|
|
122
122
|
pysmt/test/smtlib/test_fuzzed.py,sha256=pswc1F2ngXMZo-laFOs6pXnDg69JMfGPx1vMTsXdAX0,2124
|
|
123
123
|
pysmt/test/smtlib/test_generic_wrapper.py,sha256=Gn_cWynRWAFqUcAWpRgmJlkkwHcqdnARZN0-blRwM-Q,7869
|
|
@@ -143,10 +143,10 @@ pysmt/walkers/dag.py,sha256=pUdVTZx7CQyjrAb6jMfmsqS07J4kiDqHU8R4_9UvwkQ,5352
|
|
|
143
143
|
pysmt/walkers/generic.py,sha256=q1j1T2RvCeJn1PM0H5d8vNV4FTYAEQgT7h8X5DJhDf8,4534
|
|
144
144
|
pysmt/walkers/identitydag.py,sha256=f_D5qA198ayd3QO4u59fBX1RS_UiSBnPeV9O3ULvQv0,8737
|
|
145
145
|
pysmt/walkers/tree.py,sha256=WIWN9IM0riWkaD40iP4Tt3BCN21iSdE1S7gRZqy56SU,2846
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
146
|
+
pysmt-0.9.7.dev346.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
147
|
+
pysmt-0.9.7.dev346.dist-info/licenses/NOTICE,sha256=Ns-Jsa6nbqZUiTEEAM6HqioSZIxQ2RCJzxoBlWQaUfc,601
|
|
148
|
+
pysmt-0.9.7.dev346.dist-info/METADATA,sha256=kJ0L1wXh12izU66HOhoY6B48Cg-oUm8R-IjH-ZOBrM4,1774
|
|
149
|
+
pysmt-0.9.7.dev346.dist-info/WHEEL,sha256=TdQ5LtNwLuxTCjgxN51AgdU5w-KkB9ttmLbzjTH02pg,109
|
|
150
|
+
pysmt-0.9.7.dev346.dist-info/entry_points.txt,sha256=gDc1XM0xTJJMDGC_nXd0kfbX-Omjke9Dn9F3awMLYIU,57
|
|
151
|
+
pysmt-0.9.7.dev346.dist-info/top_level.txt,sha256=NwHQbpTaZMEvjIUdC0bvvj-WUyULe-nt-opK3YQNRMk,6
|
|
152
|
+
pysmt-0.9.7.dev346.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|