PySMT 0.9.7.dev441__py2.py3-none-any.whl → 0.9.7.dev446__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
@@ -19,7 +19,7 @@
19
19
  from typing import Tuple, Union
20
20
 
21
21
 
22
- VERSION: Union[Tuple[int, int, int], Tuple[int, int, int, str, int]] = (0, 9, 7, "dev", 441)
22
+ VERSION: Union[Tuple[int, int, int], Tuple[int, int, int, str, int]] = (0, 9, 7, "dev", 446)
23
23
 
24
24
  # Try to provide human-readable version of latest commit for dev versions
25
25
  # E.g. v0.5.1-4-g49a49f2-wip
pysmt/cmd/install.py CHANGED
@@ -42,7 +42,7 @@ INSTALLERS = [
42
42
  Installer(PicoSATInstaller, "965",
43
43
  {"pypicosat_minor_version" : "1708010052"}),
44
44
  Installer(CuddInstaller, "2.0.3",
45
- {"git_version" : "ecb03d6d231273343178f566cc4d7258dcce52b4"}),
45
+ {"git_version" : "0dabef26859b15710fd92e68e4eb6cf922a09de9"}),
46
46
  Installer(OptiMSatInstaller, "1.7.5", {})
47
47
  ]
48
48
 
@@ -39,16 +39,10 @@ class CuddInstaller(SolverInstaller):
39
39
  if self.architecture == "x86_64":
40
40
  makefile = "Makefile_64bit"
41
41
 
42
- swig = "swig"
43
- swig_version = SolverInstaller.run("swig -version", get_output=True)
44
- if '4.0.1' in swig_version or '4.0.0' in swig_version:
45
- print("WARNING: the BDD solver does not work with Swig4 < 4.0.2. Fallback to Swig3")
46
- swig = "swig3.0" # This is the Ubuntu naming of the executable
47
-
48
42
  import sysconfig
49
43
  PYTHON_INCLUDE_DIR = sysconfig.get_path("include")
50
- SolverInstaller.run("make -C %s -f %s PYTHON_INCL=-I%s SWIG=%s" %
51
- (self.extract_path, makefile, PYTHON_INCLUDE_DIR, swig))
44
+ SolverInstaller.run("make -C %s -f %s PYTHON_INCL=-I%s" %
45
+ (self.extract_path, makefile, PYTHON_INCLUDE_DIR))
52
46
 
53
47
 
54
48
  def move(self):
pysmt/solvers/cvcfour.py CHANGED
@@ -25,7 +25,7 @@ except ImportError:
25
25
  raise SolverAPINotFound
26
26
 
27
27
  import pysmt.typing as types
28
- from pysmt.logics import PYSMT_LOGICS, ARRAYS_CONST_LOGICS
28
+ from pysmt.logics import PYSMT_LOGICS
29
29
 
30
30
  from pysmt.solvers.solver import Solver, Converter, SolverOptions
31
31
  from pysmt.exceptions import (SolverReturnedUnknownResultError,
@@ -77,7 +77,6 @@ class CVC4Options(SolverOptions):
77
77
  class CVC4Solver(SmtLibBasicSolver):
78
78
 
79
79
  LOGICS = PYSMT_LOGICS -\
80
- ARRAYS_CONST_LOGICS -\
81
80
  set(l for l in PYSMT_LOGICS if not l.theory.linear)
82
81
 
83
82
  OptionsClass = CVC4Options
@@ -92,6 +91,9 @@ class CVC4Solver(SmtLibBasicSolver):
92
91
  self.cvc4 = None
93
92
  self.declarations = None
94
93
  self.logic_name = str(logic)
94
+ if self.logic_name.endswith("*"):
95
+ # Const-array extension (pySMT-internal suffix)
96
+ self.logic_name = self.logic_name[:-1]
95
97
  if "t" in self.logic_name:
96
98
  # Custom Type extension
97
99
  self.logic_name = self.logic_name.replace("t","")
@@ -247,11 +249,7 @@ class CVC4Converter(Converter, DagWalker):
247
249
  v = expr.getConstString()
248
250
  res = self.mgr.String(v.toString())
249
251
  elif expr.getType().isArray():
250
- const_ = expr.getConstArrayStoreAll()
251
- array_type = self._cvc4_type_to_type(const_.getType())
252
- base_value = self.back(const_.getExpr())
253
- res = self.mgr.Array(array_type.index_type,
254
- base_value)
252
+ res = self._back_array(expr)
255
253
  else:
256
254
  raise PysmtTypeError("Unsupported constant type:",
257
255
  expr.getType().toString())
@@ -260,6 +258,26 @@ class CVC4Converter(Converter, DagWalker):
260
258
 
261
259
  return res
262
260
 
261
+ def _back_array(self, expr):
262
+ """Converts a CVC4 array value into a pySMT Array.
263
+
264
+ CVC4 represents an array value as a (possibly empty) sequence of
265
+ STOREs on top of a STORE_ALL node, which holds the default value.
266
+ """
267
+ assert expr.getType().isArray(), "Expecting a CVC4 array"
268
+ stores = []
269
+ while expr.getNumChildren() == 3:
270
+ # STORE(array, index, value)
271
+ array, index, value = expr.getChildren()
272
+ stores.append((self.back(index), self.back(value)))
273
+ expr = array
274
+ const_ = expr.getConstArrayStoreAll()
275
+ array_type = self._cvc4_type_to_type(const_.getType())
276
+ res = self.mgr.Array(array_type.index_type, self.back(const_.getExpr()))
277
+ for index, value in reversed(stores):
278
+ res = self.mgr.Store(res, index, value)
279
+ return res
280
+
263
281
  @catch_conversion_error
264
282
  def convert(self, formula):
265
283
  return self.walk(formula)
@@ -334,6 +352,15 @@ class CVC4Converter(Converter, DagWalker):
334
352
  def walk_array_select(self, formula, args, **kwargs):
335
353
  return self.mkExpr(CVC4.SELECT, args[0], args[1])
336
354
 
355
+ def walk_array_value(self, formula, args, **kwargs):
356
+ arr_type = self.env.stc.get_type(formula)
357
+ rval = self.mkConst(CVC4.ArrayStoreAll(self._type_to_cvc4(arr_type),
358
+ args[0]))
359
+ # The remaining args are (index, value) pairs
360
+ for i in range(1, len(args), 2):
361
+ rval = self.mkExpr(CVC4.STORE, rval, args[i], args[i+1])
362
+ return rval
363
+
337
364
  def walk_minus(self, formula, args, **kwargs):
338
365
  return self.mkExpr(CVC4.MINUS, args[0], args[1])
339
366
 
pysmt/test/test_array.py CHANGED
@@ -18,14 +18,17 @@
18
18
 
19
19
  from pysmt.test import TestCase, main
20
20
  from pysmt.test import skipIfNoSolverForLogic, skipIfSolverNotAvailable
21
- from pysmt.logics import QF_AUFLIA, QF_AUFBV
21
+ from pysmt.logics import QF_AUFLIA, QF_AUFBV, get_logic_by_name
22
22
  from pysmt.typing import ARRAY_INT_INT, ArrayType, INT, REAL, BV8, BOOL
23
- from pysmt.shortcuts import (Solver,
23
+ from pysmt.shortcuts import (Solver, get_env, simplify,
24
24
  Symbol, Not, Equals, Int, BV, Real, FreshSymbol,
25
25
  Select, Store, Array, TRUE)
26
26
  from pysmt.exceptions import ConvertExpressionError, PysmtTypeError, PysmtValueError
27
27
 
28
28
 
29
+ QF_ALIA_CONST = get_logic_by_name("QF_ALIA*")
30
+
31
+
29
32
  class TestArray(TestCase):
30
33
 
31
34
  def test_array_type(self):
@@ -92,6 +95,22 @@ class TestArray(TestCase):
92
95
  formula = Equals(Array(BV8, TRUE()), FreshSymbol(ArrayType(BV8, BOOL)))
93
96
  self.assertSat(formula, logic=QF_AUFBV, solver_name="btor")
94
97
 
98
+ @skipIfNoSolverForLogic(QF_ALIA_CONST)
99
+ def test_const_array_model(self):
100
+ """Constant arrays round-trip through every solver supporting them."""
101
+ a = Symbol("a", ARRAY_INT_INT)
102
+ value = Store(Store(Array(INT, Int(0)), Int(1), Int(5)), Int(2), Int(7))
103
+ formula = Equals(a, value)
104
+ for name in get_env().factory.all_solvers(logic=QF_ALIA_CONST):
105
+ with Solver(name=name, logic=QF_ALIA_CONST) as s:
106
+ s.add_assertion(formula)
107
+ self.assertTrue(s.solve(), name)
108
+ model = s.get_value(a)
109
+ for idx, expected in [(Int(1), Int(5)), (Int(2), Int(7)),
110
+ (Int(42), Int(0))]:
111
+ self.assertEqual(simplify(Select(model, idx)), expected,
112
+ (name, model))
113
+
95
114
  def test_complex_types(self):
96
115
  with self.assertRaises(PysmtTypeError):
97
116
  # Not(Store(Array<Real,BV8>(8d_0), 1.0, 8d_5) =
@@ -209,7 +209,6 @@ class TestBasic(TestCase):
209
209
  @skipIfSolverNotAvailable("cvc5")
210
210
  def test_examples_cvc(self):
211
211
  for (f, validity, satisfiability, logic) in get_example_formulae():
212
- if logic.theory.arrays_const: continue
213
212
  try:
214
213
  v = is_valid(f, solver_name='cvc5', logic=logic)
215
214
  s = is_sat(f, solver_name='cvc5', logic=logic)
@@ -222,6 +221,22 @@ class TestBasic(TestCase):
222
221
  # Logic is not supported by CVC
223
222
  pass
224
223
 
224
+ @skipIfSolverNotAvailable("cvc4")
225
+ def test_examples_cvc4(self):
226
+ for (f, validity, satisfiability, logic) in get_example_formulae():
227
+ if not logic.theory.linear: continue
228
+ try:
229
+ v = is_valid(f, solver_name='cvc4', logic=logic)
230
+ s = is_sat(f, solver_name='cvc4', logic=logic)
231
+ self.assertEqual(validity, v, f)
232
+ self.assertEqual(satisfiability, s, f)
233
+ except SolverReturnedUnknownResultError:
234
+ # CVC does not handle quantifiers in a complete way
235
+ self.assertFalse(logic.quantifier_free)
236
+ except NoSolverAvailableError:
237
+ # Logic is not supported by CVC
238
+ pass
239
+
225
240
  @skipIfSolverNotAvailable("yices")
226
241
  def test_examples_yices(self):
227
242
  for (f, validity, satisfiability, logic) in get_example_formulae():
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: PySMT
3
- Version: 0.9.7.dev441
3
+ Version: 0.9.7.dev446
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
@@ -1,4 +1,4 @@
1
- pysmt/__init__.py,sha256=bzDBwVwSeJw7m70-3aSG8aHqGsfCofwH6Oog-Tlodus,1701
1
+ pysmt/__init__.py,sha256=5kJqOv_zBP-riTMt_fqKHt6vfxtVf0Y892c-MSYnt5Y,1701
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=pulb6NvROY_X8BePeyyX8T9MJLB79HZ_1FUYSlZ7Jfg,5769
@@ -22,11 +22,11 @@ pysmt/typing.py,sha256=aI8ZKEin4J2XLAHsY5fW1Pt4hZvlBlArxM4nrrmBas4,19550
22
22
  pysmt/utils.py,sha256=_dSgl45k-u9cMXSyR672GBJcKMKdtl6xSTjqXKTSfcs,2906
23
23
  pysmt/cmd/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
24
24
  pysmt/cmd/check_version.py,sha256=DCS6pHVuQm9J_vfSSDDGxtvrV6P1mEhQK-IUjacDh3s,2895
25
- pysmt/cmd/install.py,sha256=dz04Oi5S_SGVoxA_Ozzb0VEn4y8hYZ5-zkd3paYmnNQ,10468
25
+ pysmt/cmd/install.py,sha256=HK0I51_4Sjf_igi-v8dW7Q_-CVnAkvAKJsIpI6OQ9tI,10468
26
26
  pysmt/cmd/shell.py,sha256=1H5NJ9St879-U3EDizq_5l34vKPUJr-wi3MyBy164Sc,6594
27
27
  pysmt/cmd/installers/__init__.py,sha256=fEAD4FUh0Hjv7u-o9dc5nYMjzPUAzR8bWo8DSgUQjq4,1438
28
28
  pysmt/cmd/installers/base.py,sha256=agHbXV4ILfW2my8bjFLoRPmK9Jq8fPz9aESPGbPLu-g,13201
29
- pysmt/cmd/installers/bdd.py,sha256=Qq8YlYAVvxUqNXjoOlH9_Lhj4cj6WEt7HuhbSiF_L6k,2539
29
+ pysmt/cmd/installers/bdd.py,sha256=IfTSdsFYhgefb0fapbwOeyNbjkrWzgBVH6M5NvOz4qM,2190
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
@@ -55,7 +55,7 @@ pysmt/solvers/__init__.py,sha256=JXBHtcb4Lv-Sb8whc9JuGbRH2EBLWwtLUh3PL9HhNE8,650
55
55
  pysmt/solvers/bdd.py,sha256=tIW85N-iJbYUGCKucPhAsoXqo9G9bIcdBnCitzUmYTQ,15997
56
56
  pysmt/solvers/btor.py,sha256=nzT4ts-TJd7-WphU2UtpMuTkuK68D0UifYTHZyyr9gY,26053
57
57
  pysmt/solvers/cvcfive.py,sha256=M1CZ54u2i_-8lCXbE3-P1LmRfHu6vRDkE7OD6dJgoS4,25382
58
- pysmt/solvers/cvcfour.py,sha256=gv2vrFfkKxyTQu_BUlxyg9R5OnUYXbtVt1lNc21HYN0,24651
58
+ pysmt/solvers/cvcfour.py,sha256=W8Afm8J7co87Vwt4L80kIoNaPcA3eBLwEnwAw5CcoHg,25798
59
59
  pysmt/solvers/dynmsat.py,sha256=bJokwHoxKWmQGqw9nQerRDb33d5c66Sa91jUYiZXwY0,2124
60
60
  pysmt/solvers/eager.py,sha256=E2wWhRVWe6sVxW2YOwPDhZ8O53uKNuPKwLIvsRsWFPA,3681
61
61
  pysmt/solvers/interpolation.py,sha256=6AO1wMkEKSkptuC4aXlNEO8Be1K2oW3W_er2XGc_aEA,2066
@@ -72,7 +72,7 @@ pysmt/test/__init__.py,sha256=LEFbVYw4X45sgEI4_ax55g-6G5Y7kj6CLaJr1TQr4ks,5750
72
72
  pysmt/test/examples.py,sha256=6yWa-hHEMJuo5GEbjWmzg509-LQxVAyr26lxGhcK_jU,40756
73
73
  pysmt/test/omt_examples.py,sha256=LdL43fLaHiR72Cng_2st4UaYf2ueoZgStcvhccy-RdI,10338
74
74
  pysmt/test/optimization_utils.py,sha256=zbj2bN-3uMaNexF7DSjuQAR0889IcMsCiE__tGtR6zM,15665
75
- pysmt/test/test_array.py,sha256=OypmqKf_ciigxK1X_W2b9sm0EWOA3wqH376QXt7oGCM,6237
75
+ pysmt/test/test_array.py,sha256=-7R_L0d0MMuemdv0AtqNR2y8rX_w4Xc0NiaDKD4H_lY,7163
76
76
  pysmt/test/test_back.py,sha256=NnN0Wjva9Pj1ZJgUltBit_wcMIw4L_4c2fAJoT-WpvA,4536
77
77
  pysmt/test/test_bdd.py,sha256=CzOzP7CnTvhsg8KT5d8FPNSZ4uO9fI8deU1Xv8YUFIs,6194
78
78
  pysmt/test/test_bv.py,sha256=-pnOgslpMAeK9US4f_z4CU8LK0ZmDr-yceS1u1kwgps,12284
@@ -107,7 +107,7 @@ pysmt/test/test_rewritings.py,sha256=1eeseDwZyQD2VrOFBABXHTYJFJOXszP4olbCNeLcwfA
107
107
  pysmt/test/test_shannon_expansion.py,sha256=yaiZuB24wj1Zi-KdzRTmWuzAVaF9bQ603uto7zi6XBs,3082
108
108
  pysmt/test/test_simplify.py,sha256=ckQn_DUxVvGspaRNZmSPHkudhpUlG5K2w6C0wDqhL1w,7620
109
109
  pysmt/test/test_size.py,sha256=p3aqCMHfBiGLxvF0P8hE-PRQTT8VMPIJCjblq8Txh1w,3261
110
- pysmt/test/test_solving.py,sha256=n8-VE0QbxLDsr0tiMazYKYqkQkK-9P8Cag1D2wfJyJo,24952
110
+ pysmt/test/test_solving.py,sha256=sB9Nz7pTg-MjInl3MKo4rCPDLwxti3Yp1QanwxLZ4As,25637
111
111
  pysmt/test/test_sorts.py,sha256=erfInyPH91WVB8JBUYLteTo5X5skKKP3vEXdUUKC-YE,6033
112
112
  pysmt/test/test_string.py,sha256=Y6VBfkLNKuePo8-HIzcwBH3eaYj0i-k1Y8tpFyw03zw,8096
113
113
  pysmt/test/test_typechecker.py,sha256=S2O8HjN_bLN6sz86TnsWqpRtxHk2VcVsGDoRZCcQnzE,7309
@@ -143,10 +143,10 @@ pysmt/walkers/dag.py,sha256=4CWSgoXm6nONhM-1znKRU4SBCb791OTS-M9QlQFhbs8,5751
143
143
  pysmt/walkers/generic.py,sha256=dmp47kJGtO6rhC2t07Mf_FsYN-lcy64LX-dZggNnWm4,5179
144
144
  pysmt/walkers/identitydag.py,sha256=EAxSneEW91Z8GphlkbMPsPdlac7_FDcVj-_6_aunU2s,10902
145
145
  pysmt/walkers/tree.py,sha256=8oyDSXZtUsCdExcrwG3hKuEgARHgdW6fvz0LZJwjp-k,2983
146
- pysmt-0.9.7.dev441.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
147
- pysmt-0.9.7.dev441.dist-info/licenses/NOTICE,sha256=Ns-Jsa6nbqZUiTEEAM6HqioSZIxQ2RCJzxoBlWQaUfc,601
148
- pysmt-0.9.7.dev441.dist-info/METADATA,sha256=wk6mMVTRNTHWilVyD5oaVA76D_QmLxtuXyDNxAeYMPA,1774
149
- pysmt-0.9.7.dev441.dist-info/WHEEL,sha256=4YBfCYNH4wlLpv3pzq1hbEuIlXA4WJabKLFurZ7eTL0,109
150
- pysmt-0.9.7.dev441.dist-info/entry_points.txt,sha256=gDc1XM0xTJJMDGC_nXd0kfbX-Omjke9Dn9F3awMLYIU,57
151
- pysmt-0.9.7.dev441.dist-info/top_level.txt,sha256=NwHQbpTaZMEvjIUdC0bvvj-WUyULe-nt-opK3YQNRMk,6
152
- pysmt-0.9.7.dev441.dist-info/RECORD,,
146
+ pysmt-0.9.7.dev446.dist-info/licenses/LICENSE,sha256=z8d0m5b2O9McPEK1xHG_dWgUBT6EfBDz6wA0F7xSPTA,11358
147
+ pysmt-0.9.7.dev446.dist-info/licenses/NOTICE,sha256=Ns-Jsa6nbqZUiTEEAM6HqioSZIxQ2RCJzxoBlWQaUfc,601
148
+ pysmt-0.9.7.dev446.dist-info/METADATA,sha256=MFt6QHqHsJb9VP0TrTS4mMiCmy5tPWEtn0Js7dCPf38,1774
149
+ pysmt-0.9.7.dev446.dist-info/WHEEL,sha256=4YBfCYNH4wlLpv3pzq1hbEuIlXA4WJabKLFurZ7eTL0,109
150
+ pysmt-0.9.7.dev446.dist-info/entry_points.txt,sha256=gDc1XM0xTJJMDGC_nXd0kfbX-Omjke9Dn9F3awMLYIU,57
151
+ pysmt-0.9.7.dev446.dist-info/top_level.txt,sha256=NwHQbpTaZMEvjIUdC0bvvj-WUyULe-nt-opK3YQNRMk,6
152
+ pysmt-0.9.7.dev446.dist-info/RECORD,,