PySMT 0.9.7.dev337__py2.py3-none-any.whl → 0.9.7.dev354__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/solvers/cvcfive.py +163 -122
- pysmt/solvers/z3.py +5 -2
- pysmt/test/smtlib/parser_utils.py +12 -12
- pysmt/test/test_bdd.py +1 -1
- pysmt/test/test_logics.py +0 -3
- {PySMT-0.9.7.dev337.dist-info → pysmt-0.9.7.dev354.dist-info}/METADATA +11 -5
- {PySMT-0.9.7.dev337.dist-info → pysmt-0.9.7.dev354.dist-info}/RECORD +18 -18
- {PySMT-0.9.7.dev337.dist-info → pysmt-0.9.7.dev354.dist-info}/WHEEL +1 -1
- {PySMT-0.9.7.dev337.dist-info → pysmt-0.9.7.dev354.dist-info}/entry_points.txt +0 -1
- {PySMT-0.9.7.dev337.dist-info → pysmt-0.9.7.dev354.dist-info/licenses}/LICENSE +0 -0
- {PySMT-0.9.7.dev337.dist-info → pysmt-0.9.7.dev354.dist-info/licenses}/NOTICE +0 -0
- {PySMT-0.9.7.dev337.dist-info → pysmt-0.9.7.dev354.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/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:
|
|
@@ -27,18 +25,18 @@ except ImportError:
|
|
|
27
25
|
from cvc5 import Kind
|
|
28
26
|
|
|
29
27
|
import pysmt.typing as types
|
|
30
|
-
from pysmt.logics import PYSMT_LOGICS,
|
|
28
|
+
from pysmt.logics import PYSMT_LOGICS, AUFLIRA, AUFLIA, AUFNIRA, ALIA
|
|
31
29
|
|
|
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,51 +49,57 @@ 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
|
|
|
94
92
|
|
|
95
93
|
class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
96
94
|
|
|
97
|
-
|
|
98
|
-
|
|
95
|
+
# Exclude const-array logics that mix BV with integer/real arithmetic:
|
|
96
|
+
# cvc5 rejects arrays indexed by array types (e.g. QF_AUFBVLIRA*).
|
|
97
|
+
LOGICS = (PYSMT_LOGICS | {AUFLIRA, AUFLIA, AUFNIRA, ALIA}) - \
|
|
98
|
+
frozenset(l for l in PYSMT_LOGICS
|
|
99
|
+
if l.theory.arrays_const
|
|
100
|
+
and l.theory.bit_vectors
|
|
101
|
+
and (l.theory.integer_arithmetic
|
|
102
|
+
or l.theory.real_arithmetic))
|
|
99
103
|
|
|
100
104
|
OptionsClass = CVC5Options
|
|
101
105
|
|
|
@@ -104,9 +108,12 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
104
108
|
environment=environment,
|
|
105
109
|
logic=logic,
|
|
106
110
|
**options)
|
|
107
|
-
self.
|
|
111
|
+
self.cvc5_solver = cvc5.Solver()
|
|
108
112
|
self.declarations = None
|
|
109
113
|
self.logic_name = str(logic)
|
|
114
|
+
if self.logic_name.endswith("*"):
|
|
115
|
+
# Const-array extension (pySMT-internal suffix)
|
|
116
|
+
self.logic_name = self.logic_name[:-1]
|
|
110
117
|
if "t" in self.logic_name:
|
|
111
118
|
# Custom Type extension
|
|
112
119
|
self.logic_name = self.logic_name.replace("t","")
|
|
@@ -114,14 +121,23 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
114
121
|
self.logic_name = "QF_LRA"
|
|
115
122
|
elif self.logic_name == "BOOL":
|
|
116
123
|
self.logic_name = "LRA"
|
|
117
|
-
self.
|
|
124
|
+
self.cvc5_solver.setLogic(self.logic_name)
|
|
125
|
+
|
|
126
|
+
# Enable constant-array support (STORE_ALL / mkConstArray).
|
|
127
|
+
# Without this, cvc5 rejects assertions containing constant
|
|
128
|
+
# arrays with "Cannot handle assertion with term of kind
|
|
129
|
+
# STORE_ALL in this configuration."
|
|
130
|
+
try:
|
|
131
|
+
self.cvc5_solver.setOption("arrays-exp", "true")
|
|
132
|
+
except Exception:
|
|
133
|
+
pass # older cvc5 versions may not have this option
|
|
118
134
|
|
|
119
135
|
self.options(self)
|
|
120
136
|
|
|
121
|
-
self.converter = CVC5Converter(environment,
|
|
137
|
+
self.converter = CVC5Converter(environment, parent_solver=self)
|
|
122
138
|
|
|
123
139
|
def reset_assertions(self):
|
|
124
|
-
self.
|
|
140
|
+
self.cvc5_solver.resetAssertions()
|
|
125
141
|
|
|
126
142
|
def declare_variable(self, var):
|
|
127
143
|
raise NotImplementedError
|
|
@@ -129,7 +145,7 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
129
145
|
def add_assertion(self, formula, named=None):
|
|
130
146
|
self._assert_is_boolean(formula)
|
|
131
147
|
term = self.converter.convert(formula)
|
|
132
|
-
self.
|
|
148
|
+
self.cvc5_solver.assertFormula(term)
|
|
133
149
|
|
|
134
150
|
def get_model(self):
|
|
135
151
|
assignment = {}
|
|
@@ -143,10 +159,10 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
143
159
|
def solve(self, assumptions=None):
|
|
144
160
|
if assumptions is not None:
|
|
145
161
|
cvc5_assumptions = [self.converter.convert(a) for a in assumptions]
|
|
146
|
-
res = self.
|
|
162
|
+
res = self.cvc5_solver.checkSatAssuming(*cvc5_assumptions)
|
|
147
163
|
else:
|
|
148
164
|
try:
|
|
149
|
-
res = self.
|
|
165
|
+
res = self.cvc5_solver.checkSat()
|
|
150
166
|
except Exception as ex:
|
|
151
167
|
raise InternalSolverError(str(ex))
|
|
152
168
|
|
|
@@ -164,12 +180,12 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
164
180
|
raise NotImplementedError("The solver is not incremental")
|
|
165
181
|
|
|
166
182
|
for _ in range(levels):
|
|
167
|
-
self.
|
|
183
|
+
self.cvc5_solver.push()
|
|
168
184
|
return
|
|
169
185
|
|
|
170
186
|
def pop(self, levels=1):
|
|
171
187
|
for _ in range(levels):
|
|
172
|
-
self.
|
|
188
|
+
self.cvc5_solver.pop()
|
|
173
189
|
return
|
|
174
190
|
|
|
175
191
|
def print_model(self, name_filter=None):
|
|
@@ -185,7 +201,7 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
185
201
|
def get_value(self, item):
|
|
186
202
|
self._assert_no_function_type(item)
|
|
187
203
|
term = self.converter.convert(item)
|
|
188
|
-
cvc5_res = self.
|
|
204
|
+
cvc5_res = self.cvc5_solver.getValue(term)
|
|
189
205
|
res = self.converter.back(cvc5_res)
|
|
190
206
|
if self.environment.stc.get_type(item).is_real_type() and \
|
|
191
207
|
self.environment.stc.get_type(res).is_int_type():
|
|
@@ -193,7 +209,8 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
193
209
|
return res
|
|
194
210
|
|
|
195
211
|
def _exit(self):
|
|
196
|
-
del self.
|
|
212
|
+
del self.cvc5_solver
|
|
213
|
+
|
|
197
214
|
|
|
198
215
|
def set_option(self, name, value):
|
|
199
216
|
"""Sets an option.
|
|
@@ -202,16 +219,16 @@ class CVC5Solver(Solver, SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
|
202
219
|
:type name: String
|
|
203
220
|
:type value: String
|
|
204
221
|
"""
|
|
205
|
-
self.
|
|
222
|
+
self.cvc5_solver.setOption(name, value)
|
|
206
223
|
|
|
207
224
|
|
|
208
225
|
|
|
209
226
|
class CVC5Converter(Converter, DagWalker):
|
|
210
227
|
|
|
211
|
-
def __init__(self, environment,
|
|
228
|
+
def __init__(self, environment, parent_solver):
|
|
212
229
|
DagWalker.__init__(self, environment)
|
|
213
230
|
|
|
214
|
-
self.
|
|
231
|
+
self.parent_solver = parent_solver
|
|
215
232
|
|
|
216
233
|
self.declared_vars = {}
|
|
217
234
|
self.backconversion = {}
|
|
@@ -219,13 +236,21 @@ class CVC5Converter(Converter, DagWalker):
|
|
|
219
236
|
self._get_type = environment.stc.get_type
|
|
220
237
|
return
|
|
221
238
|
|
|
239
|
+
@property
|
|
240
|
+
def cvc5_solver(self):
|
|
241
|
+
'''Returns the cvc5 solver instance from the parent solver.
|
|
242
|
+
This is needed because apparently cvc5.Solver cannot be aliased
|
|
243
|
+
(probably due to the wrapper) and therefore we cannot store it directly
|
|
244
|
+
in the converter.'''
|
|
245
|
+
return self.parent_solver.cvc5_solver
|
|
246
|
+
|
|
222
247
|
def declare_variable(self, var):
|
|
223
248
|
if not var.is_symbol():
|
|
224
249
|
raise PysmtTypeError("Trying to declare as a variable something "
|
|
225
250
|
"that is not a symbol: %s" % var)
|
|
226
251
|
if var.symbol_name() not in self.declared_vars:
|
|
227
252
|
cvc5_type = self._type_to_cvc5(var.symbol_type())
|
|
228
|
-
decl = self.
|
|
253
|
+
decl = self.cvc5_solver.mkConst(cvc5_type, var.symbol_name())
|
|
229
254
|
self.declared_vars[var] = decl
|
|
230
255
|
|
|
231
256
|
def back(self, expr):
|
|
@@ -250,6 +275,11 @@ class CVC5Converter(Converter, DagWalker):
|
|
|
250
275
|
array_type = self._cvc5_type_to_type(expr.getSort())
|
|
251
276
|
base_value = self.back(const_)
|
|
252
277
|
res = self.mgr.Array(array_type.index_type, base_value)
|
|
278
|
+
elif expr.getKind() == Kind.STORE:
|
|
279
|
+
base = self.back(expr[0])
|
|
280
|
+
index = self.back(expr[1])
|
|
281
|
+
value = self.back(expr[2])
|
|
282
|
+
res = self.mgr.Store(base, index, value)
|
|
253
283
|
else:
|
|
254
284
|
raise PysmtTypeError("Unsupported expression:", str(expr))
|
|
255
285
|
|
|
@@ -260,13 +290,13 @@ class CVC5Converter(Converter, DagWalker):
|
|
|
260
290
|
return self.walk(formula)
|
|
261
291
|
|
|
262
292
|
def walk_and(self, formula, args, **kwargs):
|
|
263
|
-
return self.
|
|
293
|
+
return self.cvc5_solver.mkTerm(Kind.AND, *args)
|
|
264
294
|
|
|
265
295
|
def walk_or(self, formula, args, **kwargs):
|
|
266
|
-
return self.
|
|
296
|
+
return self.cvc5_solver.mkTerm(Kind.OR, *args)
|
|
267
297
|
|
|
268
298
|
def walk_not(self, formula, args, **kwargs):
|
|
269
|
-
return self.
|
|
299
|
+
return self.cvc5_solver.mkTerm(Kind.NOT, *args)
|
|
270
300
|
|
|
271
301
|
def walk_symbol(self, formula, args, **kwargs):
|
|
272
302
|
#pylint: disable=unused-argument
|
|
@@ -275,238 +305,249 @@ class CVC5Converter(Converter, DagWalker):
|
|
|
275
305
|
return self.declared_vars[formula]
|
|
276
306
|
|
|
277
307
|
def walk_iff(self, formula, args, **kwargs):
|
|
278
|
-
return self.
|
|
308
|
+
return self.cvc5_solver.mkTerm(Kind.EQUAL, args[0], args[1])
|
|
279
309
|
|
|
280
310
|
def walk_implies(self, formula, args, **kwargs):
|
|
281
|
-
return self.
|
|
311
|
+
return self.cvc5_solver.mkTerm(Kind.IMPLIES, args[0], args[1])
|
|
282
312
|
|
|
283
313
|
def walk_le(self, formula, args, **kwargs):
|
|
284
|
-
return self.
|
|
314
|
+
return self.cvc5_solver.mkTerm(Kind.LEQ, args[0], args[1])
|
|
285
315
|
|
|
286
316
|
def walk_lt(self, formula, args, **kwargs):
|
|
287
|
-
return self.
|
|
317
|
+
return self.cvc5_solver.mkTerm(Kind.LT, args[0], args[1])
|
|
288
318
|
|
|
289
319
|
def walk_ite(self, formula, args, **kwargs):
|
|
290
|
-
return self.
|
|
320
|
+
return self.cvc5_solver.mkTerm(Kind.ITE, args[0], args[1], args[2])
|
|
291
321
|
|
|
292
322
|
def walk_real_constant(self, formula, **kwargs):
|
|
293
323
|
frac = formula.constant_value()
|
|
294
324
|
n,d = frac.numerator, frac.denominator
|
|
295
325
|
rep = str(n) + "/" + str(d)
|
|
296
|
-
return self.
|
|
326
|
+
return self.cvc5_solver.mkReal(rep)
|
|
297
327
|
|
|
298
328
|
def walk_int_constant(self, formula, **kwargs):
|
|
299
329
|
assert is_pysmt_integer(formula.constant_value())
|
|
300
330
|
rep = str(formula.constant_value())
|
|
301
|
-
return self.
|
|
331
|
+
return self.cvc5_solver.mkInteger(rep)
|
|
302
332
|
|
|
303
333
|
def walk_bool_constant(self, formula, **kwargs):
|
|
304
|
-
return self.
|
|
334
|
+
return self.cvc5_solver.mkBoolean(formula.constant_value())
|
|
305
335
|
|
|
306
336
|
def walk_exists(self, formula, args, **kwargs):
|
|
307
337
|
(bound_formula, var_list) = \
|
|
308
338
|
self._rename_bound_variables(args[0], formula.quantifier_vars())
|
|
309
|
-
bound_vars_list = self.
|
|
310
|
-
return self.
|
|
339
|
+
bound_vars_list = self.cvc5_solver.mkTerm(Kind.VARIABLE_LIST, *var_list)
|
|
340
|
+
return self.cvc5_solver.mkTerm(Kind.EXISTS,
|
|
311
341
|
bound_vars_list,
|
|
312
342
|
bound_formula)
|
|
313
343
|
|
|
314
344
|
def walk_forall(self, formula, args, **kwargs):
|
|
315
345
|
(bound_formula, var_list) = \
|
|
316
346
|
self._rename_bound_variables(args[0], formula.quantifier_vars())
|
|
317
|
-
bound_vars_list = self.
|
|
318
|
-
return self.
|
|
347
|
+
bound_vars_list = self.cvc5_solver.mkTerm(Kind.VARIABLE_LIST, *var_list)
|
|
348
|
+
return self.cvc5_solver.mkTerm(Kind.FORALL,
|
|
319
349
|
bound_vars_list,
|
|
320
350
|
bound_formula)
|
|
321
351
|
|
|
322
352
|
def walk_plus(self, formula, args, **kwargs):
|
|
323
|
-
return self.
|
|
353
|
+
return self.cvc5_solver.mkTerm(Kind.ADD, *args)
|
|
324
354
|
|
|
325
355
|
def walk_array_store(self, formula, args, **kwargs):
|
|
326
|
-
return self.
|
|
356
|
+
return self.cvc5_solver.mkTerm(Kind.STORE, args[0], args[1], args[2])
|
|
327
357
|
|
|
328
358
|
def walk_array_select(self, formula, args, **kwargs):
|
|
329
|
-
return self.
|
|
359
|
+
return self.cvc5_solver.mkTerm(Kind.SELECT, args[0], args[1])
|
|
360
|
+
|
|
361
|
+
def walk_array_value(self, formula, args, **kwargs):
|
|
362
|
+
arr_sort = self._type_to_cvc5(formula.get_type())
|
|
363
|
+
# args[0] is the converted default value
|
|
364
|
+
const_arr = self.cvc5_solver.mkConstArray(arr_sort, args[0])
|
|
365
|
+
# Remaining args are (index, value) pairs for point overrides
|
|
366
|
+
result = const_arr
|
|
367
|
+
for i in range(1, len(args), 2):
|
|
368
|
+
result = self.cvc5_solver.mkTerm(Kind.STORE, result, args[i], args[i + 1])
|
|
369
|
+
return result
|
|
330
370
|
|
|
331
371
|
def walk_minus(self, formula, args, **kwargs):
|
|
332
|
-
return self.
|
|
372
|
+
return self.cvc5_solver.mkTerm(Kind.SUB, args[0], args[1])
|
|
333
373
|
|
|
334
374
|
def walk_equals(self, formula, args, **kwargs):
|
|
335
|
-
return self.
|
|
375
|
+
return self.cvc5_solver.mkTerm(Kind.EQUAL, args[0], args[1])
|
|
336
376
|
|
|
337
377
|
def walk_times(self, formula, args, **kwargs):
|
|
338
|
-
return self.
|
|
378
|
+
return self.cvc5_solver.mkTerm(Kind.MULT, *args)
|
|
339
379
|
|
|
340
380
|
def walk_div(self, formula, args, **kwargs):
|
|
341
381
|
if self.env.stc.get_type(formula).is_int_type():
|
|
342
|
-
return self.
|
|
382
|
+
return self.cvc5_solver.mkTerm(Kind.INTS_DIVISION, *args)
|
|
343
383
|
else:
|
|
344
|
-
return self.
|
|
384
|
+
return self.cvc5_solver.mkTerm(Kind.DIVISION, *args)
|
|
345
385
|
|
|
346
386
|
def walk_pow(self, formula, args, **kwargs):
|
|
347
|
-
return self.
|
|
387
|
+
return self.cvc5_solver.mkTerm(Kind.TO_REAL,
|
|
388
|
+
self.cvc5_solver.mkTerm(Kind.POW, args[0], args[1]))
|
|
348
389
|
|
|
349
390
|
def walk_toreal(self, formula, args, **kwargs):
|
|
350
|
-
return self.
|
|
391
|
+
return self.cvc5_solver.mkTerm(Kind.TO_REAL, args[0])
|
|
351
392
|
|
|
352
393
|
def walk_function(self, formula, args, **kwargs):
|
|
353
394
|
name = formula.function_name()
|
|
354
395
|
if name not in self.declared_vars:
|
|
355
396
|
self.declare_variable(name)
|
|
356
397
|
decl = self.declared_vars[name]
|
|
357
|
-
return self.
|
|
398
|
+
return self.cvc5_solver.mkTerm(Kind.APPLY_UF, decl, *args)
|
|
358
399
|
|
|
359
400
|
def walk_bv_constant(self, formula, **kwargs):
|
|
360
401
|
v = formula.constant_value()
|
|
361
402
|
width = formula.bv_width()
|
|
362
|
-
return self.
|
|
403
|
+
return self.cvc5_solver.mkBitVector(width, str(v), 10)
|
|
363
404
|
|
|
364
405
|
def walk_bv_ult(self, formula, args, **kwargs):
|
|
365
|
-
return self.
|
|
406
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_ULT, args[0], args[1])
|
|
366
407
|
|
|
367
408
|
def walk_bv_ule(self, formula, args, **kwargs):
|
|
368
|
-
return self.
|
|
409
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_ULE, args[0], args[1])
|
|
369
410
|
|
|
370
411
|
def walk_bv_concat(self, formula, args, **kwargs):
|
|
371
|
-
return self.
|
|
412
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_CONCAT, args[0], args[1])
|
|
372
413
|
|
|
373
414
|
def walk_bv_extract(self, formula, args, **kwargs):
|
|
374
|
-
ext = self.
|
|
415
|
+
ext = self.cvc5_solver.mkOp(Kind.BITVECTOR_EXTRACT,
|
|
375
416
|
formula.bv_extract_end(),
|
|
376
417
|
formula.bv_extract_start())
|
|
377
|
-
return self.
|
|
418
|
+
return self.cvc5_solver.mkTerm(ext, args[0])
|
|
378
419
|
|
|
379
420
|
def walk_bv_or(self, formula, args, **kwargs):
|
|
380
|
-
return self.
|
|
421
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_OR, args[0], args[1])
|
|
381
422
|
|
|
382
423
|
def walk_bv_not(self, formula, args, **kwargs):
|
|
383
|
-
return self.
|
|
424
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_NOT, args[0])
|
|
384
425
|
|
|
385
426
|
def walk_bv_and(self, formula, args, **kwargs):
|
|
386
|
-
return self.
|
|
427
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_AND, args[0], args[1])
|
|
387
428
|
|
|
388
429
|
def walk_bv_xor(self, formula, args, **kwargs):
|
|
389
|
-
return self.
|
|
430
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_XOR, args[0], args[1])
|
|
390
431
|
|
|
391
432
|
def walk_bv_add(self, formula, args, **kwargs):
|
|
392
|
-
return self.
|
|
433
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_ADD, *args)
|
|
393
434
|
|
|
394
435
|
def walk_bv_sub(self, formula, args, **kwargs):
|
|
395
|
-
return self.
|
|
436
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_SUB, args[0], args[1])
|
|
396
437
|
|
|
397
438
|
def walk_bv_neg(self, formula, args, **kwargs):
|
|
398
|
-
return self.
|
|
439
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_NEG, args[0])
|
|
399
440
|
|
|
400
441
|
def walk_bv_mul(self, formula, args, **kwargs):
|
|
401
|
-
return self.
|
|
442
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_MULT, args[0], args[1])
|
|
402
443
|
|
|
403
444
|
def walk_bv_tonatural(self, formula, args, **kwargs):
|
|
404
|
-
return self.
|
|
445
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_TO_NAT, args[0])
|
|
405
446
|
|
|
406
447
|
def walk_bv_udiv(self, formula, args, **kwargs):
|
|
407
|
-
return self.
|
|
448
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_UDIV, *args)
|
|
408
449
|
|
|
409
450
|
def walk_bv_urem(self, formula, args, **kwargs):
|
|
410
|
-
return self.
|
|
451
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_UREM, *args)
|
|
411
452
|
|
|
412
453
|
def walk_bv_lshl(self, formula, args, **kwargs):
|
|
413
|
-
return self.
|
|
454
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_SHL, args[0], args[1])
|
|
414
455
|
|
|
415
456
|
def walk_bv_lshr(self, formula, args, **kwargs):
|
|
416
|
-
return self.
|
|
457
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_LSHR, args[0], args[1])
|
|
417
458
|
|
|
418
459
|
def walk_bv_rol(self, formula, args, **kwargs):
|
|
419
|
-
ext = self.
|
|
420
|
-
return self.
|
|
460
|
+
ext = self.cvc5_solver.mkOp(Kind.BITVECTOR_ROTATE_LEFT, formula.bv_rotation_step())
|
|
461
|
+
return self.cvc5_solver.mkTerm(ext, args[0])
|
|
421
462
|
|
|
422
463
|
def walk_bv_ror(self, formula, args, **kwargs):
|
|
423
|
-
ext = self.
|
|
424
|
-
return self.
|
|
464
|
+
ext = self.cvc5_solver.mkOp(Kind.BITVECTOR_ROTATE_RIGHT, formula.bv_rotation_step())
|
|
465
|
+
return self.cvc5_solver.mkTerm(ext, args[0])
|
|
425
466
|
|
|
426
467
|
def walk_bv_zext(self, formula, args, **kwargs):
|
|
427
|
-
ext = self.
|
|
428
|
-
return self.
|
|
468
|
+
ext = self.cvc5_solver.mkOp(Kind.BITVECTOR_ZERO_EXTEND, formula.bv_extend_step())
|
|
469
|
+
return self.cvc5_solver.mkTerm(ext, args[0])
|
|
429
470
|
|
|
430
471
|
def walk_bv_sext (self, formula, args, **kwargs):
|
|
431
|
-
ext = self.
|
|
432
|
-
return self.
|
|
472
|
+
ext = self.cvc5_solver.mkOp(Kind.BITVECTOR_SIGN_EXTEND, formula.bv_extend_step())
|
|
473
|
+
return self.cvc5_solver.mkTerm(ext, args[0])
|
|
433
474
|
|
|
434
475
|
def walk_bv_slt(self, formula, args, **kwargs):
|
|
435
|
-
return self.
|
|
476
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_SLT, args[0], args[1])
|
|
436
477
|
|
|
437
478
|
def walk_bv_sle(self, formula, args, **kwargs):
|
|
438
|
-
return self.
|
|
479
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_SLE, args[0], args[1])
|
|
439
480
|
|
|
440
481
|
def walk_bv_comp(self, formula, args, **kwargs):
|
|
441
|
-
return self.
|
|
482
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_COMP, args[0], args[1])
|
|
442
483
|
|
|
443
484
|
def walk_bv_sdiv(self, formula, args, **kwargs):
|
|
444
|
-
return self.
|
|
485
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_SDIV, *args)
|
|
445
486
|
|
|
446
487
|
def walk_bv_srem(self, formula, args, **kwargs):
|
|
447
|
-
return self.
|
|
488
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_SREM, *args)
|
|
448
489
|
|
|
449
490
|
def walk_bv_ashr(self, formula, args, **kwargs):
|
|
450
|
-
return self.
|
|
491
|
+
return self.cvc5_solver.mkTerm(Kind.BITVECTOR_ASHR, args[0], args[1])
|
|
451
492
|
|
|
452
493
|
def walk_str_constant(self, formula, args, **kwargs):
|
|
453
|
-
return self.
|
|
494
|
+
return self.cvc5_solver.mkString(formula.constant_value())
|
|
454
495
|
|
|
455
496
|
def walk_str_length (self, formula, args, **kwargs):
|
|
456
|
-
return self.
|
|
497
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_LENGTH , args[0])
|
|
457
498
|
|
|
458
499
|
def walk_str_concat(self, formula, args, **kwargs):
|
|
459
|
-
return self.
|
|
500
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_CONCAT, *args)
|
|
460
501
|
|
|
461
502
|
def walk_str_contains(self, formula, args, **kwargs):
|
|
462
|
-
return self.
|
|
503
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_CONTAINS, args[0], args[1])
|
|
463
504
|
|
|
464
505
|
def walk_str_indexof(self, formula, args, **kwargs):
|
|
465
|
-
return self.
|
|
506
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_INDEXOF, args[0], args[1], args[2])
|
|
466
507
|
|
|
467
508
|
def walk_str_replace(self, formula, args, **kwargs):
|
|
468
|
-
return self.
|
|
509
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_REPLACE, args[0], args[1], args[2])
|
|
469
510
|
|
|
470
511
|
def walk_str_substr(self, formula, args, **kwargs):
|
|
471
|
-
return self.
|
|
512
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_SUBSTR, args[0], args[1], args[2])
|
|
472
513
|
|
|
473
514
|
def walk_str_prefixof(self, formula, args, **kwargs):
|
|
474
|
-
return self.
|
|
515
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_PREFIX, args[0], args[1])
|
|
475
516
|
|
|
476
517
|
def walk_str_suffixof(self, formula, args, **kwargs):
|
|
477
|
-
return self.
|
|
518
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_SUFFIX, args[0], args[1])
|
|
478
519
|
|
|
479
520
|
def walk_str_to_int(self, formula, args, **kwargs):
|
|
480
|
-
return self.
|
|
521
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_TO_INT, args[0])
|
|
481
522
|
|
|
482
523
|
def walk_int_to_str(self, formula, args, **kwargs):
|
|
483
|
-
return self.
|
|
524
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_FROM_INT, args[0])
|
|
484
525
|
|
|
485
526
|
def walk_str_charat(self, formula, args, **kwargs):
|
|
486
|
-
return self.
|
|
527
|
+
return self.cvc5_solver.mkTerm(Kind.STRING_CHARAT, args[0], args[1])
|
|
487
528
|
|
|
488
529
|
def _type_to_cvc5(self, tp):
|
|
489
530
|
if tp.is_bool_type():
|
|
490
|
-
return self.
|
|
531
|
+
return self.cvc5_solver.getBooleanSort()
|
|
491
532
|
elif tp.is_real_type():
|
|
492
|
-
return self.
|
|
533
|
+
return self.cvc5_solver.getRealSort()
|
|
493
534
|
elif tp.is_int_type():
|
|
494
|
-
return self.
|
|
535
|
+
return self.cvc5_solver.getIntegerSort()
|
|
495
536
|
elif tp.is_function_type():
|
|
496
537
|
stps = [self._type_to_cvc5(x) for x in tp.param_types]
|
|
497
538
|
rtp = self._type_to_cvc5(tp.return_type)
|
|
498
|
-
return self.
|
|
539
|
+
return self.cvc5_solver.mkFunctionSort(stps, rtp)
|
|
499
540
|
elif tp.is_array_type():
|
|
500
541
|
# Recursively convert the types of index and elem
|
|
501
542
|
idx_cvc_type = self._type_to_cvc5(tp.index_type)
|
|
502
543
|
elem_cvc_type = self._type_to_cvc5(tp.elem_type)
|
|
503
|
-
return self.
|
|
544
|
+
return self.cvc5_solver.mkArraySort(idx_cvc_type, elem_cvc_type)
|
|
504
545
|
elif tp.is_bv_type():
|
|
505
|
-
return self.
|
|
546
|
+
return self.cvc5_solver.mkBitVectorSort(tp.width)
|
|
506
547
|
elif tp.is_string_type():
|
|
507
|
-
return self.
|
|
548
|
+
return self.cvc5_solver.getStringSort()
|
|
508
549
|
elif tp.is_custom_type():
|
|
509
|
-
return self.
|
|
550
|
+
return self.cvc5_solver.mkUninterpretedSort(str(tp))
|
|
510
551
|
else:
|
|
511
552
|
raise NotImplementedError("Unsupported type: %s" %tp)
|
|
512
553
|
|
|
@@ -539,7 +580,7 @@ class CVC5Converter(Converter, DagWalker):
|
|
|
539
580
|
Returns a tuple (new_formula, new_var_list) in which the old
|
|
540
581
|
variables have been replaced by the new variables in the list.
|
|
541
582
|
"""
|
|
542
|
-
mkBoundVar = self.
|
|
583
|
+
mkBoundVar = self.cvc5_solver.mkVar
|
|
543
584
|
new_var_list = [mkBoundVar(self._type_to_cvc5(x.symbol_type()),
|
|
544
585
|
x.symbol_name())
|
|
545
586
|
for x in variables]
|
pysmt/solvers/z3.py
CHANGED
|
@@ -45,7 +45,8 @@ from pysmt.exceptions import (SolverReturnedUnknownResultError,
|
|
|
45
45
|
UndefinedSymbolError, PysmtValueError,
|
|
46
46
|
PysmtInfinityError, PysmtInfinitesimalError)
|
|
47
47
|
from pysmt.decorators import clear_pending_pop, catch_conversion_error
|
|
48
|
-
from pysmt.logics import LRA, LIA, QF_UFLRA, QF_UFLIA, PYSMT_LOGICS
|
|
48
|
+
from pysmt.logics import LRA, LIA, QF_UFLRA, QF_UFLIA, PYSMT_LOGICS, \
|
|
49
|
+
AUFLIRA, AUFLIA, AUFNIRA, ALIA
|
|
49
50
|
from pysmt.oracles import get_logic
|
|
50
51
|
from pysmt.constants import Fraction, Numeral, is_pysmt_integer
|
|
51
52
|
|
|
@@ -141,7 +142,9 @@ class Z3Options(SolverOptions):
|
|
|
141
142
|
class Z3Solver(IncrementalTrackingSolver, UnsatCoreSolver,
|
|
142
143
|
SmtLibBasicSolver, SmtLibIgnoreMixin):
|
|
143
144
|
|
|
144
|
-
LOGICS =
|
|
145
|
+
LOGICS = (PYSMT_LOGICS |
|
|
146
|
+
{AUFLIRA, AUFLIA, AUFNIRA, ALIA}) -\
|
|
147
|
+
set(x for x in PYSMT_LOGICS if x.theory.strings)
|
|
145
148
|
OptionsClass = Z3Options
|
|
146
149
|
|
|
147
150
|
SOLVERFOR_LOGIC_NAMES=['AUFLIA', 'ALIA', 'AUFLIRA', 'AUFNIRA', 'LRA', 'LIA', 'NIA',
|
|
@@ -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__':
|
pysmt/test/test_logics.py
CHANGED
|
@@ -114,9 +114,6 @@ class TestLogic(TestCase):
|
|
|
114
114
|
with self.assertRaises(NoSolverAvailableError):
|
|
115
115
|
Solver(logic=pysmt.logics.QF_BOOL)
|
|
116
116
|
|
|
117
|
-
with self.assertRaises(NoSolverAvailableError):
|
|
118
|
-
Solver(logic=NRA)
|
|
119
|
-
|
|
120
117
|
with self.assertRaises(NoSolverAvailableError):
|
|
121
118
|
Solver(name='picosat', logic=pysmt.logics.QF_BV)
|
|
122
119
|
|
|
@@ -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.dev354
|
|
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,4 +1,4 @@
|
|
|
1
|
-
pysmt/__init__.py,sha256=
|
|
1
|
+
pysmt/__init__.py,sha256=uBJ4BYtJu6BmmYf3DQXRU33TOF0WoY4GPIbasdKMLJU,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
|
|
@@ -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=Sk0s1MrSGXdgLqPu_I-Xs19nG08e2HpZyeAehF-OE60,23877
|
|
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
|
|
@@ -67,14 +67,14 @@ pysmt/solvers/qelim.py,sha256=Fjy54lbyIKahAzGajhaihXYQyYn97h83Ud2er-zjwcw,4822
|
|
|
67
67
|
pysmt/solvers/smtlib.py,sha256=6gGq-UdCVrrdmliCNl2RByyn5qMqBtVVDP_sB2jXiQ8,8998
|
|
68
68
|
pysmt/solvers/solver.py,sha256=Me-0lvKcXV5PEL4N0wk2u7R1hGi-6JtlbdFNL-PimzM,17678
|
|
69
69
|
pysmt/solvers/yices.py,sha256=ZU3iqj29oKnqDnDnPnfKvS1QBAGEMecrQgZ14qRsoUQ,24489
|
|
70
|
-
pysmt/solvers/z3.py,sha256=
|
|
70
|
+
pysmt/solvers/z3.py,sha256=mG55ZtxnEswPEmEb1HzCmRei4RuTxWEjQBJcX_ejhTY,42782
|
|
71
71
|
pysmt/test/__init__.py,sha256=IwYjp7mgUeozyYHb8D-lRiZKHUJ_srsAiyYttuSWbj0,5492
|
|
72
72
|
pysmt/test/examples.py,sha256=XymEXLmIZxMtS9qTfzrXYbi4DBaMTgPzd_ijKh1H2aM,39485
|
|
73
73
|
pysmt/test/omt_examples.py,sha256=f1DKD3dtxWEsMRFYdj_ZLMR6vezP9rSTzmb83weux0Q,9583
|
|
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
|
|
@@ -91,7 +91,7 @@ pysmt/test/test_imports.py,sha256=f41EUBrlDItgQ_6SPhWW8-tuwMrdMFXHJzaxrHHB43Q,15
|
|
|
91
91
|
pysmt/test/test_int.py,sha256=dk72Q6viqRUs9XiPB40n6RrwiqsV6GbbKuSlYaQMU9k,1980
|
|
92
92
|
pysmt/test/test_interpolation.py,sha256=WTodZtnxH5slIvUWbHbjjnI2o0naXgZwZawTGhh3E0o,3941
|
|
93
93
|
pysmt/test/test_lira.py,sha256=1B4y1y2U-5CttF6h22tniJkAedUDIwjp1Ad0_Ha_s-8,2175
|
|
94
|
-
pysmt/test/test_logics.py,sha256=
|
|
94
|
+
pysmt/test/test_logics.py,sha256=bWwE_7rq9SVcXglE-ugteGeCHXAYFiBdi-QgIL9-9KE,6893
|
|
95
95
|
pysmt/test/test_models.py,sha256=npqGoF-3DgAw0DTx6se32ZEZRFBJDcnkppzgyjLDbps,2748
|
|
96
96
|
pysmt/test/test_native_qe.py,sha256=RGZgwbpAkPBTjIqcCbOkZ_nQXIDZ4Fznrr7Ldx6oA38,3439
|
|
97
97
|
pysmt/test/test_nia.py,sha256=x51d0X5jnZnxTPvPLrlD0WilunZ5uNrDU4vWY78_xpU,6640
|
|
@@ -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.dev354.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
|
|
147
|
+
pysmt-0.9.7.dev354.dist-info/licenses/NOTICE,sha256=Ns-Jsa6nbqZUiTEEAM6HqioSZIxQ2RCJzxoBlWQaUfc,601
|
|
148
|
+
pysmt-0.9.7.dev354.dist-info/METADATA,sha256=aN86-wbV_Ecv0rIdVX-I91h9MQmxn-z5IDS-3jxAl-c,1774
|
|
149
|
+
pysmt-0.9.7.dev354.dist-info/WHEEL,sha256=TdQ5LtNwLuxTCjgxN51AgdU5w-KkB9ttmLbzjTH02pg,109
|
|
150
|
+
pysmt-0.9.7.dev354.dist-info/entry_points.txt,sha256=gDc1XM0xTJJMDGC_nXd0kfbX-Omjke9Dn9F3awMLYIU,57
|
|
151
|
+
pysmt-0.9.7.dev354.dist-info/top_level.txt,sha256=NwHQbpTaZMEvjIUdC0bvvj-WUyULe-nt-opK3YQNRMk,6
|
|
152
|
+
pysmt-0.9.7.dev354.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|