Exemple #1
0
 def test_warp_solvermodel(self):
     x, y, z = [FreshSymbol() for _ in xrange(3)]
     with Solver(name='z3') as solver:
         solver.add_assertion(And(x,y,z))
         solver.solve()
         z3_model = solver.get_model()
         eager_model = EagerModel(z3_model)
         for var, value  in eager_model:
             self.assertIn(var, [x,y,z])
             self.assertEqual(value, TRUE())
Exemple #2
0
 def test_examples_solving(self):
     for example in EXAMPLE_FORMULAS:
         if example.logic != pysmt.logics.BOOL:
             continue
         solver = Solver(logic=pysmt.logics.BOOL, name='bdd')
         solver.add_assertion(example.expr)
         if example.is_sat:
             self.assertTrue(solver.solve())
         else:
             self.assertFalse(solver.solve())
Exemple #3
0
    def test_msat_back_not_identical(self):
        msat = Solver(name="msat", logic=QF_UFLIRA)

        r, s = FreshSymbol(REAL), FreshSymbol(REAL)
        # r + 1 > s + 1
        f = GT(Plus(r, Real(1)), Plus(s, Real(1)))

        term = msat.converter.convert(f)
        res = msat.converter.back(term)
        self.assertFalse(f == res)
Exemple #4
0
 def test_boolector_assumptions(self):
     with Solver(name='btor') as solver:
         x = Symbol('x')
         y = Symbol('y')
         solver.add_assertion(Or(x, y))
         solver.solve([Not(x), Not(y)])
         btor_notx = solver.converter.convert(Not(x))
         btor_noty = solver.converter.convert(Not(y))
         self.assertEqual(solver.btor.Failed(btor_notx, btor_noty),
                          [True, True])
Exemple #5
0
 def test_btor_options(self):
     for (f, _, sat, logic) in get_example_formulae():
         if logic == QF_BV:
             solver = Solver(name="btor",
                             solver_options={"rewrite-level":0,
                                             "fun:dual-prop":1,
                                             "eliminate-slices":1})
             solver.add_assertion(f)
             res = solver.solve()
             self.assertTrue(res == sat)
Exemple #6
0
 def test_yices_push(self):
     with Solver(name="yices") as solver:
         solver.add_assertion(FALSE())
         res = solver.solve()
         self.assertFalse(res)
         solver.push()
         solver.add_assertion(TRUE())
         res = solver.solve()
         self.assertFalse(res)
         solver.pop()
 def test_msat(self):
     self.solver = Solver(name="msat")
     conv = self.solver.converter
     self.solver_simplify = lambda x: conv.back(conv.convert(x))
     # Run the tests
     self.all_unary()
     self.all_binary()
     self.all_special()
     self.extract()
     self.concat_different_length()
Exemple #8
0
 def test_examples_solving(self):
     for example in get_example_formulae():
         if example.logic != BOOL:
             continue
         solver = Solver(logic=BOOL, name='bdd')
         solver.add_assertion(example.expr)
         if example.is_sat:
             self.assertTrue(solver.solve())
         else:
             self.assertFalse(solver.solve())
Exemple #9
0
    def test_add_assertion(self):
        r = FreshSymbol(REAL)
        f1 = Plus(r, r)
        f2 = GT(r, r)

        for sname in get_env().factory.all_solvers(logic=QF_LRA):
            with Solver(name=sname) as solver:
                with self.assertRaises(PysmtTypeError):
                    solver.add_assertion(f1)
                self.assertIsNone(solver.add_assertion(f2))
Exemple #10
0
 def test_initial_ordering(self):
     with Solver(name="bdd",
                 logic=BOOL,
                 solver_options={
                     'static_ordering': [self.x, self.y],
                     'dynamic_reordering': True
                 }) as s:
         s.add_assertion(self.big_tree)
         self.assertTrue(s.solve())
         self.assertNotEquals(s.ddmanager.ReorderingStatus()[1], 0)
Exemple #11
0
 def test_irrational(self):
     x = FreshSymbol(REAL)
     f = Equals(Times(x, x), Real(2))
     with Solver(name="z3") as s:
         self.assertTrue(s.is_sat(f))
         model = s.get_model()
         xval = model[x]
         self.assertTrue(xval.is_algebraic_constant())
         approx = Fraction(-3109888511975, 2199023255552)
         self.assertEqual(xval.algebraic_approx_value(), approx)
Exemple #12
0
    def test_add_assertions(self):
        varA = Symbol("A", BOOL)
        varB = Symbol("B", BOOL)
        varC = Symbol("C", BOOL)

        assertions = [varA, Implies(varA, varB), Implies(varB, varC)]
        for name in get_env().factory.all_solvers(logic=QF_BOOL):
            with Solver(name) as solver:
                solver.add_assertions(assertions)
                solver.solve()
                self.assertTrue(solver.get_py_value(And(assertions)))
Exemple #13
0
    def setUp(self):
        self.x, self.y = Symbol("x"), Symbol("y")

        self.bdd_solver = Solver(logic=pysmt.logics.BOOL, name='bdd')
        self.bdd_converter = self.bdd_solver.converter

        trail = [And, Or, And, Or]
        f = And(self.x, self.y)
        for op in trail:
            f = op(f, f)
        self.big_tree = f
    def test_generic_wrapper_enable_debug(self):
        a = Symbol("A", BOOL)
        f = And(a, Not(a))

        for n in self.all_solvers:
            with Solver(name=n,
                        logic=QF_BOOL,
                        solver_options={'debug_interaction': True}) as s:
                s.add_assertion(f)
                res = s.solve()
                self.assertFalse(res)
Exemple #15
0
    def test_msat_partial_model(self):
        msat = Solver(name="msat")
        x, y = Symbol("x"), Symbol("y")
        msat.add_assertion(x)
        c = msat.solve()
        self.assertTrue(c)

        model = msat.get_model()
        self.assertNotIn(y, model)
        self.assertIn(x, model)
        msat.exit()
Exemple #16
0
    def test_z3_nary_back(self):
        from z3 import Tactic
        r = Symbol("r", REAL)
        s = Symbol("s", REAL)
        t = Symbol("t", REAL)
        f = Equals(Times(r,s,t), Real(0))

        with Solver(name="z3") as solver:
            z3_f = solver.converter.convert(f)
            z3_f = Tactic('simplify', solver.z3.ctx)(z3_f).as_expr()
            fp = solver.converter.back(z3_f)
            self.assertValid(Iff(f, fp), (f, fp))
Exemple #17
0
 def test_reordering_algorithms(self):
     from pysmt.solvers.bdd import BddOptions
     for algo in BddOptions.CUDD_ALL_REORDERING_ALGORITHMS:
         with Solver(name="bdd",
                     logic=BOOL,
                     solver_options={
                         'dynamic_reordering': True,
                         'reordering_algorithm': algo
                     }) as s:
             s.add_assertion(self.big_tree)
             self.assertTrue(s.solve())
             self.assertEqual(algo, s.ddmanager.ReorderingStatus()[1])
Exemple #18
0
 def test_custom_types(self):
     A = Type("A", 0)
     a, b = Symbol("a", A), Symbol("b", A)
     p = Symbol("p", INT)
     fun = Symbol("g", FunctionType(A, [INT, A]))
     app = Function(fun, [p, b])
     f_a = Equals(a, app)
     for n in self.all_solvers:
         with Solver(name=n, logic=QF_UFLIA) as s:
             s.add_assertion(f_a)
             res = s.solve()
             self.assertTrue(res)
    def test_clear_pop_smtlibsolver(self):
        for n in self.all_solvers:
            with Solver(name=n, logic=QF_LRA) as s:
                x1, x2 = [Symbol(var, REAL) for var in ["x1", "x2"]]
                init = LT(Plus(x1, Real(-1), x2), Real(Fraction(1, 4)))
                invar = TRUE()
                safe = LT(Plus(x1, x2), Real(8))
                invar_init = And(invar, init)
                iv_imp = Implies(invar, safe)

                self.assertFalse(s.is_unsat(invar_init))
                self.assertFalse(s.is_valid(iv_imp))
Exemple #20
0
def solve(formula, n, max_models=None, solver="msat"):
    s = Solver(name=solver)
    st = s.is_sat(formula)
    if st:
        vs = [x for xs in variables(n) for x in xs]
        k = 0
        s.add_assertion(formula)
        while s.solve() and ((not max_models) or k < max_models):
            k = k + 1
            model = s.get_model()
            s.add_assertion(Not(And([EqualsOrIff(v, model[v]) for v in vs])))
            yield to_bn(model, n)
Exemple #21
0
 def __init__(self, solver_name, name, logic, incremental, solver_options, basename=None):
     self.solver_name = solver_name
     self.name = name
     self.logic = logic
     self.incremental = incremental
     self.solver_options = solver_options
     self.basename = basename
     self.smt2vars = set([])
     self.solver = Solver(name=solver_name, logic=logic, incremental=incremental, solver_options=solver_options)
     self.smt2vars_inc = []
     if basename is not None:
         self.trace_file = "%s-%s.smt2"%(basename, name)
Exemple #22
0
def get_value():
    solver = Solver('z3')
    parser = SmtLibParser()
    script = parser.get_script_fname("get_value.smt2")
    #result = script.evaluate(Solver('z3'))
    exprs = []
    for get_val_cmd in script.filter_by_command_name("get-value"):
        exprs.extend(get_val_cmd.args)
    formula = script.get_last_formula()
    solver.add_assertion(formula)
    result1 = solver.solve()
    result2 = solver.get_values(exprs)
Exemple #23
0
    def test_msat_preferred_variable(self):
        a, b, c = [Symbol(x) for x in "abc"]
        na, nb, nc = [Not(Symbol(x)) for x in "abc"]

        f = And(Implies(a, And(b, c)), Implies(na, And(nb, nc)))

        s1 = Solver("msat")
        s1.add_assertion(f)
        s1.set_preferred_var(a, True)
        self.assertTrue(s1.solve())
        self.assertTrue(s1.get_value(a).is_true())

        s2 = Solver("msat")
        s2.add_assertion(f)
        s2.set_preferred_var(a, False)
        self.assertTrue(s2.solve())
        self.assertTrue(s2.get_value(a).is_false())

        # Show that calling without polarity still works
        # This case is harder to test, because we only say
        # that the split will occur on that variable first.
        s1.set_preferred_var(a)
Exemple #24
0
    def test_eager_model_iterator(self):
        x, y, z = [Symbol(s) for s in "xyz"]
        with Solver(logic=QF_BOOL) as s:
            s.add_assertion(And(x, y))
            assert s.solve()
            d = {}
            d[x] = s.get_value(x)
            d[y] = s.get_value(y)
        m = EagerModel(assignment=d)

        # The model does not talk about 'z'
        for (k, _) in m:
            self.assertFalse(k == z)
    def test_generic_wrapper_model(self):
        a = Symbol("A", BOOL)
        b = Symbol("B", BOOL)
        f = And(a, Not(b))

        for n in self.all_solvers:
            with Solver(name=n, logic=QF_BOOL) as s:
                s.add_assertion(f)
                res = s.solve()
                self.assertTrue(res)

                self.assertFalse(s.get_py_value(b))
                self.assertTrue(s.get_py_value(a))
Exemple #26
0
    def test_integer(self):
        x = FreshSymbol(INT)
        f = Equals(Times(x, x), Int(2))
        with Solver(name="z3") as s:
            self.assertFalse(s.is_sat(f))

        # f = Equals(Times(Int(4), Pow(x, Int(-1))), Int(2))
        # self.assertTrue(is_sat(f, solver_name="z3"))

        f = Equals(Div(Int(4), x), Int(2))
        self.assertTrue(is_sat(f, solver_name="z3"))
        f = Equals(Times(x, x), Int(16))
        self.assertTrue(is_sat(f))
Exemple #27
0
    def test_get_value_of_function(self):
        """get_value on a function should raise an exception."""
        h = Symbol("h", FunctionType(REAL, [REAL, REAL]))

        h_0_0 = Function(h, (Real(0), Real(1)))
        f = GT(h_0_0, Real(0))
        for sname in get_env().factory.all_solvers(logic=QF_UFLIRA):
            with Solver(name=sname) as solver:
                solver.add_assertion(f)
                res = solver.solve()
                self.assertTrue(res)
                with self.assertRaises(PysmtTypeError):
                    solver.get_value(h)
                self.assertIsNotNone(solver.get_value(h_0_0))
Exemple #28
0
 def test_examples_by_logic(self):
     for (f, validity, satisfiability, logic) in get_example_formulae():
         if len(get_env().factory.all_solvers(logic=logic)) > 0:
             try:
                 v = is_valid(f, logic=logic)
                 s = is_sat(f, logic=logic)
                 self.assertEqual(validity, v, f.serialize())
                 self.assertEqual(satisfiability, s, f.serialize())
             except SolverReturnedUnknownResultError:
                 s = Solver(logic=logic)
                 print(s, logic, f.serialize())
                 self.assertFalse(logic.quantifier_free,
                                  "Unkown result are accepted only on "\
                                  "Quantified formulae")
def implies(term1, term2):
    with Solver() as solver:
        solver.add_assertion(term1 & ~term2)
        solver.solve()
        try:
            solver.get_model()
            return False
        except InternalSolverError:
            return True
        except Exception as e:
            if "Z3Exception" in e.__class__.__name__:
                return True
            else:
                raise
Exemple #30
0
def solve_soduku_model(model):
    solver = Solver()
    solver.add_assertion(model.extractConstraints())

    if solver.solve():  # solution found
        solution = tabletools.generateEmptyTable(model.n)

        for y in range(0, model.n):  # retrive the values from the sloved model
            for x in range(0, model.n):
                solution[y][x] = solver.get_value(model.getSymbol(x, y))

        return solution

    else:
        return None  # couldn't solve model :(