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 CHANGED
@@ -16,7 +16,7 @@
16
16
  # limitations under the License.
17
17
  #
18
18
 
19
- VERSION = (0, 9, 7, "dev", 337)
19
+ VERSION = (0, 9, 7, "dev", 354)
20
20
 
21
21
  # Try to provide human-readable version of latest commit for dev versions
22
22
  # E.g. v0.5.1-4-g49a49f2-wip
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.10", {}),
36
- Installer(CVC5Installer, "1.1.2", {}),
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", {}),
@@ -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"""
@@ -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["arch"] = "msvc"
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"] = "osx"
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
- # Overwrite setup.py with the patched version
74
- setup_py = os.path.join(self.python_bindings_dir, "setup.py")
75
- SolverInstaller.mv(setup_py, setup_py + ".original")
76
- SolverInstaller.do_download(setup_py_win_url, setup_py)
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, "../lib")
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 f.endswith(".so") or f.endswith(".pyd"):
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 OSX
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"
@@ -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 = "http://optimathsat.disi.unitn.it/releases/optimathsat-%s/{archive_name}" % solver_version
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,
@@ -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 sys, os
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 = os.path.join(bdir, libdir)
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, ARRAYS_CONST_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
- NonLinearError, PysmtValueError,
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, to_python_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(cvc5, name, value):
52
+ def _set_option(cvc5_solver, name, value):
55
53
  try:
56
- cvc5.setOption(name, value)
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.cvc5,
60
+ self._set_option(solver.cvc5_solver,
63
61
  "strings-exp", "true")
64
62
 
65
- self._set_option(solver.cvc5,
63
+ self._set_option(solver.cvc5_solver,
66
64
  "produce-models", str(self.generate_models).lower())
67
- self._set_option(solver.cvc5,
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.cvc5,
68
+ self._set_option(solver.cvc5_solver,
71
69
  "seed", str(self.random_seed))
72
70
 
73
- # self._set_option(solver.cvc5, "miplib-trick", "true")
74
- # self._set_option(solver.cvc5, "miplib-trick-subs", "4")
75
- # self._set_option(solver.cvc5, "use-approx", "true")
76
- # self._set_option(solver.cvc5, "lemmas-on-replay-failure", "true")
77
- # self._set_option(solver.cvc5, "replay-early-close-depth", "4")
78
- # self._set_option(solver.cvc5, "replay-lemma-reject-cut", "128")
79
- # self._set_option(solver.cvc5, "replay-reject-cut", "512")
80
- # self._set_option(solver.cvc5, "unconstrained-simp", "true")
81
- # self._set_option(solver.cvc5, "use-soi", "true")
82
- # self._set_option(solver.cvc5, "pb-rewrites", "true")
83
- self._set_option(solver.cvc5, "ite-simp", "true")
84
- self._set_option(solver.cvc5, "simp-ite-compress", "true")
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.cvc5, "nl-ext-tplanes", "true")
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.cvc5, str(k), str(v))
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
- LOGICS = PYSMT_LOGICS -\
98
- ARRAYS_CONST_LOGICS
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.cvc5 = cvc5.Solver()
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.cvc5.setLogic(self.logic_name)
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, cvc5=self.cvc5)
137
+ self.converter = CVC5Converter(environment, parent_solver=self)
122
138
 
123
139
  def reset_assertions(self):
124
- self.cvc5.resetAssertions()
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.cvc5.assertFormula(term)
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.cvc5.checkSatAssuming(*cvc5_assumptions)
162
+ res = self.cvc5_solver.checkSatAssuming(*cvc5_assumptions)
147
163
  else:
148
164
  try:
149
- res = self.cvc5.checkSat()
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.cvc5.push()
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.cvc5.pop()
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.cvc5.getValue(term)
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.cvc5
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.cvc5.setOption(name, value)
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, cvc5):
228
+ def __init__(self, environment, parent_solver):
212
229
  DagWalker.__init__(self, environment)
213
230
 
214
- self.cvc5 = cvc5
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.cvc5.mkConst(cvc5_type, var.symbol_name())
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.cvc5.mkTerm(Kind.AND, *args)
293
+ return self.cvc5_solver.mkTerm(Kind.AND, *args)
264
294
 
265
295
  def walk_or(self, formula, args, **kwargs):
266
- return self.cvc5.mkTerm(Kind.OR, *args)
296
+ return self.cvc5_solver.mkTerm(Kind.OR, *args)
267
297
 
268
298
  def walk_not(self, formula, args, **kwargs):
269
- return self.cvc5.mkTerm(Kind.NOT, *args)
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.cvc5.mkTerm(Kind.EQUAL, args[0], args[1])
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.cvc5.mkTerm(Kind.IMPLIES, args[0], args[1])
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.cvc5.mkTerm(Kind.LEQ, args[0], args[1])
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.cvc5.mkTerm(Kind.LT, args[0], args[1])
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.cvc5.mkTerm(Kind.ITE, args[0], args[1], args[2])
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.cvc5.mkReal(rep)
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.cvc5.mkInteger(rep)
331
+ return self.cvc5_solver.mkInteger(rep)
302
332
 
303
333
  def walk_bool_constant(self, formula, **kwargs):
304
- return self.cvc5.mkBoolean(formula.constant_value())
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.cvc5.mkTerm(Kind.VARIABLE_LIST, *var_list)
310
- return self.cvc5.mkTerm(Kind.EXISTS,
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.cvc5.mkTerm(Kind.VARIABLE_LIST, *var_list)
318
- return self.cvc5.mkTerm(Kind.FORALL,
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.cvc5.mkTerm(Kind.ADD, *args)
353
+ return self.cvc5_solver.mkTerm(Kind.ADD, *args)
324
354
 
325
355
  def walk_array_store(self, formula, args, **kwargs):
326
- return self.cvc5.mkTerm(Kind.STORE, args[0], args[1], args[2])
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.cvc5.mkTerm(Kind.SELECT, args[0], args[1])
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.cvc5.mkTerm(Kind.SUB, args[0], args[1])
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.cvc5.mkTerm(Kind.EQUAL, args[0], args[1])
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.cvc5.mkTerm(Kind.MULT, *args)
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.cvc5.mkTerm(Kind.INTS_DIVISION, *args)
382
+ return self.cvc5_solver.mkTerm(Kind.INTS_DIVISION, *args)
343
383
  else:
344
- return self.cvc5.mkTerm(Kind.DIVISION, *args)
384
+ return self.cvc5_solver.mkTerm(Kind.DIVISION, *args)
345
385
 
346
386
  def walk_pow(self, formula, args, **kwargs):
347
- return self.cvc5.mkTerm(Kind.POW, args[0], self.cvc5.mkTerm(Kind.TO_REAL, args[1]))
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.cvc5.mkTerm(Kind.TO_REAL, args[0])
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.cvc5.mkTerm(Kind.APPLY_UF, decl, *args)
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.cvc5.mkBitVector(width, str(v), 10)
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.cvc5.mkTerm(Kind.BITVECTOR_ULT, args[0], args[1])
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.cvc5.mkTerm(Kind.BITVECTOR_ULE, args[0], args[1])
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.cvc5.mkTerm(Kind.BITVECTOR_CONCAT, args[0], args[1])
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.cvc5.mkOp(Kind.BITVECTOR_EXTRACT,
415
+ ext = self.cvc5_solver.mkOp(Kind.BITVECTOR_EXTRACT,
375
416
  formula.bv_extract_end(),
376
417
  formula.bv_extract_start())
377
- return self.cvc5.mkTerm(ext, args[0])
418
+ return self.cvc5_solver.mkTerm(ext, args[0])
378
419
 
379
420
  def walk_bv_or(self, formula, args, **kwargs):
380
- return self.cvc5.mkTerm(Kind.BITVECTOR_OR, args[0], args[1])
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.cvc5.mkTerm(Kind.BITVECTOR_NOT, args[0])
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.cvc5.mkTerm(Kind.BITVECTOR_AND, args[0], args[1])
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.cvc5.mkTerm(Kind.BITVECTOR_XOR, args[0], args[1])
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.cvc5.mkTerm(Kind.BITVECTOR_ADD, *args)
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.cvc5.mkTerm(Kind.BITVECTOR_SUB, args[0], args[1])
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.cvc5.mkTerm(Kind.BITVECTOR_NEG, args[0])
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.cvc5.mkTerm(Kind.BITVECTOR_MULT, args[0], args[1])
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.cvc5.mkTerm(Kind.BITVECTOR_TO_NAT, args[0])
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.cvc5.mkTerm(Kind.BITVECTOR_UDIV, *args)
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.cvc5.mkTerm(Kind.BITVECTOR_UREM, *args)
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.cvc5.mkTerm(Kind.BITVECTOR_SHL, args[0], args[1])
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.cvc5.mkTerm(Kind.BITVECTOR_LSHR, args[0], args[1])
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.cvc5.mkOp(Kind.BITVECTOR_ROTATE_LEFT, formula.bv_rotation_step())
420
- return self.cvc5.mkTerm(ext, args[0])
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.cvc5.mkOp(Kind.BITVECTOR_ROTATE_RIGHT, formula.bv_rotation_step())
424
- return self.cvc5.mkTerm(ext, args[0])
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.cvc5.mkOp(Kind.BITVECTOR_ZERO_EXTEND, formula.bv_extend_step())
428
- return self.cvc5.mkTerm(ext, args[0])
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.cvc5.mkOp(Kind.BITVECTOR_SIGN_EXTEND, formula.bv_extend_step())
432
- return self.cvc5.mkTerm(ext, args[0])
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.cvc5.mkTerm(Kind.BITVECTOR_SLT, args[0], args[1])
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.cvc5.mkTerm(Kind.BITVECTOR_SLE, args[0], args[1])
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.cvc5.mkTerm(Kind.BITVECTOR_COMP, args[0], args[1])
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.cvc5.mkTerm(Kind.BITVECTOR_SDIV, *args)
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.cvc5.mkTerm(Kind.BITVECTOR_SREM, *args)
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.cvc5.mkTerm(Kind.BITVECTOR_ASHR, args[0], args[1])
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.cvc5.mkString(formula.constant_value())
494
+ return self.cvc5_solver.mkString(formula.constant_value())
454
495
 
455
496
  def walk_str_length (self, formula, args, **kwargs):
456
- return self.cvc5.mkTerm(Kind.STRING_LENGTH , args[0])
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.cvc5.mkTerm(Kind.STRING_CONCAT, *args)
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.cvc5.mkTerm(Kind.STRING_CONTAINS, args[0], args[1])
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.cvc5.mkTerm(Kind.STRING_INDEXOF, args[0], args[1], args[2])
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.cvc5.mkTerm(Kind.STRING_REPLACE, args[0], args[1], args[2])
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.cvc5.mkTerm(Kind.STRING_SUBSTR, args[0], args[1], args[2])
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.cvc5.mkTerm(Kind.STRING_PREFIX, args[0], args[1])
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.cvc5.mkTerm(Kind.STRING_SUFFIX, args[0], args[1])
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.cvc5.mkTerm(Kind.STRING_TO_INT, args[0])
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.cvc5.mkTerm(Kind.STRING_FROM_INT, args[0])
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.cvc5.mkTerm(Kind.STRING_CHARAT, args[0], args[1])
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.cvc5.getBooleanSort()
531
+ return self.cvc5_solver.getBooleanSort()
491
532
  elif tp.is_real_type():
492
- return self.cvc5.getRealSort()
533
+ return self.cvc5_solver.getRealSort()
493
534
  elif tp.is_int_type():
494
- return self.cvc5.getIntegerSort()
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.cvc5.mkFunctionSort(stps, rtp)
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.cvc5.mkArraySort(idx_cvc_type, elem_cvc_type)
544
+ return self.cvc5_solver.mkArraySort(idx_cvc_type, elem_cvc_type)
504
545
  elif tp.is_bv_type():
505
- return self.cvc5.mkBitVectorSort(tp.width)
546
+ return self.cvc5_solver.mkBitVectorSort(tp.width)
506
547
  elif tp.is_string_type():
507
- return self.cvc5.getStringSort()
548
+ return self.cvc5_solver.getStringSort()
508
549
  elif tp.is_custom_type():
509
- return self.cvc5.mkUninterpretedSort(str(tp))
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.cvc5.mkVar
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 = PYSMT_LOGICS - set(x for x in PYSMT_LOGICS if x.theory.strings)
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
- solver = Solver(logic=logic, incremental=False,
56
- generate_models=False)
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)
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.assertNotEquals(s.ddmanager.ReorderingStatus()[1], 0)
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
1
+ Metadata-Version: 2.4
2
2
  Name: PySMT
3
- Version: 0.9.7.dev337
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
- Platform: UNKNOWN
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=4qoWpE_YchHcFrvD6jeWloG3_PgCmssRGEMDiaBtTtY,1598
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=2p5o6hdqnejcNfF4nv0vmoi-wkCdaTCMLu5nL-GU9Hw,10468
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=1usHiBHrIBam9BlbVKG-6F52KPsIkJBeghkd_ckh-8U,12811
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=hNz7TbqYrEg9I0vvkSaBiKdy4v8RxH8oXGhXQhgNIVU,5409
34
- pysmt/cmd/installers/optimsat.py,sha256=ijbFb8dl0t4ruzVH1mrgKWWpxvRoN_1ROY4KlvroPv4,3908
35
- pysmt/cmd/installers/pico.py,sha256=XJpVbY5YHboL3OEMBvjwv8QwKdJ7Y62Blb78tEGyMxU,3141
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=z8o4VxrZBC6sdb_JYTWfRS3BXdWJPznakN3k7rD4EY8,21073
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=XE388MLsnd5lipftzB5laDy4fOMxUsDBVAp0jX_pUzM,42679
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=GsFiq0YQd3exbN9k2fCurKZlvDl3H2VAucYc9tKGKEc,6195
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=Nppv0G7z0XIE8wHyWI3F04Vy1PY2iMVwvjyDcYBeS8A,6980
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=8pvCwJ0Ba_yGzC9wRmkuleAkSmdQnvxTm4rM5lD8bkQ,13678
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
- PySMT-0.9.7.dev337.dist-info/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
147
- PySMT-0.9.7.dev337.dist-info/METADATA,sha256=llt-p3vZt1Ly6hCzRAlptfBz9gO3Bu2uXR4_kemWylE,1617
148
- PySMT-0.9.7.dev337.dist-info/NOTICE,sha256=Ns-Jsa6nbqZUiTEEAM6HqioSZIxQ2RCJzxoBlWQaUfc,601
149
- PySMT-0.9.7.dev337.dist-info/WHEEL,sha256=Kh9pAotZVRFj97E15yTA4iADqXdQfIVTHcNaZTjxeGM,110
150
- PySMT-0.9.7.dev337.dist-info/entry_points.txt,sha256=si0hIk-v3V35G3p8QGINoQ4QW-v4RYDRqj-asgyCgeM,58
151
- PySMT-0.9.7.dev337.dist-info/top_level.txt,sha256=NwHQbpTaZMEvjIUdC0bvvj-WUyULe-nt-opK3YQNRMk,6
152
- PySMT-0.9.7.dev337.dist-info/RECORD,,
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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: bdist_wheel (0.45.1)
2
+ Generator: setuptools (82.0.1)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py2-none-any
5
5
  Tag: py3-none-any
@@ -1,3 +1,2 @@
1
1
  [console_scripts]
2
2
  pysmt-install = pysmt.cmd.install:main
3
-