2021-04-12 12:31:43 -07:00
|
|
|
###############################################################################
|
|
|
|
|
# Top contributors (to current version):
|
2025-01-23 09:54:20 -08:00
|
|
|
# Aina Niemetz, Ying Sheng, Yoni Zohar
|
2021-04-12 12:31:43 -07:00
|
|
|
#
|
|
|
|
|
# This file is part of the cvc5 project.
|
|
|
|
|
#
|
2025-01-23 09:54:20 -08:00
|
|
|
# Copyright (c) 2009-2025 by the authors listed in the file AUTHORS
|
2021-04-12 12:31:43 -07:00
|
|
|
# in the top-level source directory and their institutional affiliations.
|
|
|
|
|
# All rights reserved. See the file COPYING in the top-level source
|
|
|
|
|
# directory for licensing information.
|
|
|
|
|
# #############################################################################
|
2021-04-05 06:30:19 -07:00
|
|
|
##
|
2021-04-12 12:31:43 -07:00
|
|
|
|
2021-04-05 06:30:19 -07:00
|
|
|
import pytest
|
2022-02-02 15:45:42 -08:00
|
|
|
import cvc5
|
2021-04-05 06:30:19 -07:00
|
|
|
import sys
|
2024-04-01 14:12:16 -07:00
|
|
|
from math import isnan
|
2021-04-05 06:30:19 -07:00
|
|
|
|
2025-09-08 10:47:59 -03:00
|
|
|
from cvc5 import Kind, OptionCategory, SortKind, TermManager, Solver, Plugin
|
2024-03-14 14:34:58 -07:00
|
|
|
from cvc5 import RoundingMode
|
|
|
|
|
from cvc5 import BlockModelsMode, LearnedLitType, FindSynthTarget
|
|
|
|
|
from cvc5 import ProofComponent, ProofFormat
|
2021-04-05 06:30:19 -07:00
|
|
|
|
2021-05-17 11:20:31 -07:00
|
|
|
|
2021-04-05 06:30:19 -07:00
|
|
|
@pytest.fixture
|
2024-03-14 14:34:58 -07:00
|
|
|
def tm():
|
2024-03-18 13:20:34 -07:00
|
|
|
return TermManager()
|
2024-03-14 14:34:58 -07:00
|
|
|
@pytest.fixture
|
|
|
|
|
def solver(tm):
|
2024-03-18 13:20:34 -07:00
|
|
|
return Solver(tm)
|
2021-04-05 06:30:19 -07:00
|
|
|
|
2021-05-17 11:20:31 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_recoverable_exception(tm, solver):
|
2021-04-05 06:30:19 -07:00
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(solver.getBooleanSort(), "x")
|
2021-04-05 06:30:19 -07:00
|
|
|
solver.assertFormula(x.eqTerm(x).notTerm())
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
c = solver.getValue(x)
|
|
|
|
|
|
2021-05-17 11:20:31 -07:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
def test_declare_fun_fresh(tm, solver):
|
|
|
|
|
boolSort = tm.getBooleanSort()
|
|
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
t1 = solver.declareFun("b", [], boolSort, True)
|
|
|
|
|
t2 = solver.declareFun("b", [], boolSort, False)
|
|
|
|
|
t3 = solver.declareFun("b", [], boolSort, False)
|
|
|
|
|
assert not t1 == t2
|
|
|
|
|
assert not t1 == t3
|
|
|
|
|
assert t2 == t3
|
|
|
|
|
t4 = solver.declareFun("c", [], boolSort, False)
|
|
|
|
|
assert not t2 == t4
|
|
|
|
|
t5 = solver.declareFun("b", [], intSort, False)
|
|
|
|
|
assert not t2 == t5
|
|
|
|
|
|
|
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.declareFun("b", [], intSort, False)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_declare_fun(tm, solver):
|
|
|
|
|
bvSort = tm.mkBitVectorSort(32)
|
|
|
|
|
funSort = tm.mkFunctionSort(tm.mkUninterpretedSort("u"),\
|
|
|
|
|
tm.getIntegerSort())
|
2021-05-18 10:11:16 -07:00
|
|
|
solver.declareFun("f1", [], bvSort)
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.declareFun("f3", [bvSort, tm.getIntegerSort()], bvSort)
|
2021-05-18 10:11:16 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.declareFun("f2", [], funSort)
|
|
|
|
|
# functions as arguments is allowed
|
|
|
|
|
solver.declareFun("f4", [bvSort, funSort], bvSort)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.declareFun("f5", [bvSort, bvSort], funSort)
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
2022-08-03 08:15:50 -07:00
|
|
|
slv.declareFun("f1", [], bvSort)
|
2021-05-18 10:11:16 -07:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.declareFun("f1", [], bvSort)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def decalre_datatype(tm, solver):
|
|
|
|
|
lin = tm.mkDatatypeConstructorDecl("lin")
|
|
|
|
|
solver.declareDatatype("", [lin])
|
|
|
|
|
|
|
|
|
|
nil = tm.mkDatatypeConstructorDecl("nil")
|
|
|
|
|
solver.declareDatatype("a", [nil])
|
|
|
|
|
|
|
|
|
|
cons = tm.mkDatatypeConstructorDecl("cons")
|
|
|
|
|
nil2 = tm.mkDatatypeConstructorDecl("nil")
|
|
|
|
|
solver.declareDatatype("b", [cons, nil2])
|
|
|
|
|
|
|
|
|
|
cons2 = tm.mkDatatypeConstructorDecl("cons")
|
|
|
|
|
nil3 = tm.mkDatatypeConstructorDecl("nil")
|
|
|
|
|
solver.declareDatatype("", [cons2, nil3])
|
|
|
|
|
|
|
|
|
|
# must have at least one constructor
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.declareDatatype("c", [])
|
|
|
|
|
# constructors may not be reused
|
|
|
|
|
ctor1 = tm.mkDatatypeConstructorDecl("_x21")
|
|
|
|
|
ctor2 = tm.mkDatatypeConstructorDecl("_x31")
|
|
|
|
|
s3 = solver.declareDatatype("_x17", [ctor1, ctor2])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.declareDatatype("_x86", [ctor1, ctor2])
|
|
|
|
|
|
|
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
nnil = tm.mkDatatypeConstructorDecl("nil")
|
|
|
|
|
slv.declareDatatype("a", [nnil])
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2021-05-18 10:11:16 -07:00
|
|
|
|
|
|
|
|
def test_declare_sort(solver):
|
|
|
|
|
solver.declareSort("s", 0)
|
|
|
|
|
solver.declareSort("s", 2)
|
|
|
|
|
solver.declareSort("", 2)
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2023-08-29 20:43:20 -05:00
|
|
|
def test_declare_sort_fresh(solver):
|
|
|
|
|
t1 = solver.declareSort("b", 0, True)
|
|
|
|
|
t2 = solver.declareSort("b", 0, False)
|
|
|
|
|
t3 = solver.declareSort("b", 0, False)
|
|
|
|
|
assert t1!=t2
|
|
|
|
|
assert t1!=t3
|
|
|
|
|
assert t2==t3
|
|
|
|
|
t4 = solver.declareSort("c", 0, False)
|
|
|
|
|
assert t2!=t4
|
|
|
|
|
t5 = solver.declareSort("b", 1, False)
|
|
|
|
|
assert t2!=t5
|
2021-05-18 10:11:16 -07:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_define_fun(tm, solver):
|
|
|
|
|
bvSort = tm.mkBitVectorSort(32)
|
|
|
|
|
funSort = tm.mkFunctionSort(tm.mkUninterpretedSort("u"),
|
|
|
|
|
tm.getIntegerSort())
|
|
|
|
|
b1 = tm.mkVar(bvSort, "b1")
|
|
|
|
|
b2 = tm.mkVar(tm.getIntegerSort(), "b2")
|
|
|
|
|
b3 = tm.mkVar(funSort, "b3")
|
|
|
|
|
v1 = tm.mkConst(bvSort, "v1")
|
|
|
|
|
v2 = tm.mkConst(funSort, "v2")
|
2021-05-18 10:11:16 -07:00
|
|
|
solver.defineFun("f", [], bvSort, v1)
|
|
|
|
|
solver.defineFun("ff", [b1, b2], bvSort, v1)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFun("ff", [v1, b2], bvSort, v1)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2021-10-28 12:04:06 -05:00
|
|
|
solver.defineFun("fff", [b1], bvSort, v2)
|
2021-05-18 10:11:16 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
2021-10-28 12:04:06 -05:00
|
|
|
solver.defineFun("ffff", [b1], funSort, v2)
|
2021-05-18 10:11:16 -07:00
|
|
|
# b3 has function sort, which is allowed as an argument
|
|
|
|
|
solver.defineFun("fffff", [b1, b3], bvSort, v1)
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
bvSort2 = ttm.mkBitVectorSort(32)
|
|
|
|
|
v12 = ttm.mkConst(bvSort2, "v1")
|
|
|
|
|
b12 = ttm.mkVar(bvSort2, "b1")
|
|
|
|
|
b22 = ttm.mkVar(ttm.getIntegerSort(), "b2")
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFun("f", [], bvSort, v12)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFun("f", [], bvSort2, v1)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFun("ff", [b1, b22], bvSort2, v12)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFun("ff", [b12, b2], bvSort2, v12)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFun("ff", [b12, b22], bvSort, v12)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFun("ff", [b12, b22], bvSort2, v1)
|
2021-05-18 10:11:16 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_define_fun_global(tm, solver):
|
2022-05-10 10:47:52 -07:00
|
|
|
bSort = solver.getBooleanSort()
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
bTrue = tm.mkBoolean(True)
|
2022-05-10 10:47:52 -07:00
|
|
|
# (define-fun f () Bool true)
|
|
|
|
|
f = solver.defineFun("f", [], bSort, bTrue, True)
|
2024-03-14 14:34:58 -07:00
|
|
|
b = tm.mkVar(bSort, "b")
|
2022-05-10 10:47:52 -07:00
|
|
|
# (define-fun g (b Bool) Bool b)
|
|
|
|
|
g = solver.defineFun("g", [b], bSort, b, True)
|
|
|
|
|
|
|
|
|
|
# (assert (or (not f) (not (g true))))
|
|
|
|
|
solver.assertFormula(
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(Kind.OR, f.notTerm(),
|
|
|
|
|
tm.mkTerm(Kind.APPLY_UF, g, bTrue).notTerm()))
|
2022-05-10 10:47:52 -07:00
|
|
|
assert solver.checkSat().isUnsat()
|
|
|
|
|
solver.resetAssertions()
|
|
|
|
|
# (assert (or (not f) (not (g true))))
|
|
|
|
|
solver.assertFormula(
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(Kind.OR, f.notTerm(),
|
|
|
|
|
tm.mkTerm(Kind.APPLY_UF, g, bTrue).notTerm()))
|
2022-05-10 10:47:52 -07:00
|
|
|
assert solver.checkSat().isUnsat()
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFun("f", [], bSort, bTrue, True)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2022-05-10 10:47:52 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_define_fun_rec(tm, solver):
|
|
|
|
|
bvSort = tm.mkBitVectorSort(32)
|
|
|
|
|
funSort1 = tm.mkFunctionSort([bvSort, bvSort], bvSort)
|
|
|
|
|
funSort2 = tm.mkFunctionSort(
|
|
|
|
|
tm.mkUninterpretedSort("u"), tm.getIntegerSort())
|
|
|
|
|
b1 = tm.mkVar(bvSort, "b1")
|
|
|
|
|
b11 = tm.mkVar(bvSort, "b1")
|
|
|
|
|
b2 = tm.mkVar(tm.getIntegerSort(), "b2")
|
|
|
|
|
b3 = tm.mkVar(funSort2, "b3")
|
|
|
|
|
v1 = tm.mkConst(bvSort, "v1")
|
|
|
|
|
v2 = tm.mkConst(tm.getIntegerSort(), "v2")
|
|
|
|
|
v3 = tm.mkConst(funSort2, "v3")
|
|
|
|
|
f1 = tm.mkConst(funSort1, "f1")
|
|
|
|
|
f2 = tm.mkConst(funSort2, "f2")
|
|
|
|
|
f3 = tm.mkConst(bvSort, "f3")
|
2021-05-18 10:11:16 -07:00
|
|
|
solver.defineFunRec("f", [], bvSort, v1)
|
|
|
|
|
solver.defineFunRec("ff", [b1, b2], bvSort, v1)
|
|
|
|
|
solver.defineFunRec(f1, [b1, b11], v1)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunRec("fff", [b1], bvSort, v3)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunRec("ff", [b1, v2], bvSort, v1)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunRec("ffff", [b1], funSort2, v3)
|
|
|
|
|
# b3 has function sort, which is allowed as an argument
|
|
|
|
|
solver.defineFunRec("fffff", [b1, b3], bvSort, v1)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunRec(f1, [b1], v1)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunRec(f1, [b1, b11], v2)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunRec(f1, [b1, b11], v3)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunRec(f2, [b1], v2)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunRec(f3, [b1], v1)
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
bvSort2 = ttm.mkBitVectorSort(32)
|
|
|
|
|
v12 = ttm.mkConst(bvSort2, "v1")
|
|
|
|
|
b12 = ttm.mkVar(bvSort2, "b1")
|
2025-04-15 18:39:01 -07:00
|
|
|
b22 = ttm.mkVar(ttm.getIntegerSort(), "b2")
|
2021-05-18 10:11:16 -07:00
|
|
|
slv.defineFunRec("f", [], bvSort2, v12)
|
|
|
|
|
slv.defineFunRec("ff", [b12, b22], bvSort2, v12)
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunRec("f", [], bvSort, v12)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunRec("f", [], bvSort2, v1)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunRec("ff", [b1, b22], bvSort2, v12)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunRec("ff", [b12, b2], bvSort2, v12)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunRec("ff", [b12, b22], bvSort, v12)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunRec("ff", [b12, b22], bvSort2, v1)
|
2021-05-18 10:11:16 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_define_fun_rec_wrong_logic(tm, solver):
|
2021-05-18 10:11:16 -07:00
|
|
|
solver.setLogic("QF_BV")
|
2024-03-14 14:34:58 -07:00
|
|
|
bvSort = tm.mkBitVectorSort(32)
|
|
|
|
|
funSort = tm.mkFunctionSort([bvSort, bvSort], bvSort)
|
|
|
|
|
b = tm.mkVar(bvSort, "b")
|
|
|
|
|
v = tm.mkConst(bvSort, "v")
|
|
|
|
|
f = tm.mkConst(funSort, "f")
|
2021-05-18 10:11:16 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunRec("f", [], bvSort, v)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunRec(f, [b, b], v)
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_define_fun_rec_global(tm, solver):
|
2024-03-18 13:20:34 -07:00
|
|
|
bSort = tm.getBooleanSort()
|
|
|
|
|
fSort = tm.mkFunctionSort([bSort], bSort)
|
2022-05-10 10:47:52 -07:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
solver.push()
|
|
|
|
|
bTrue = tm.mkBoolean(True)
|
|
|
|
|
# (define-fun f () Bool true)
|
|
|
|
|
f = solver.defineFunRec("f", [], bSort, bTrue, True)
|
|
|
|
|
b = tm.mkVar(bSort, "b")
|
|
|
|
|
gSym = tm.mkConst(fSort, "g")
|
|
|
|
|
# (define-fun g (b Bool) Bool b)
|
|
|
|
|
g = solver.defineFunRec(gSym, [b], b, glbl=True)
|
2022-05-10 10:47:52 -07:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
# (assert (or (not f) (not (g true))))
|
|
|
|
|
solver.assertFormula(tm.mkTerm(
|
|
|
|
|
Kind.OR, f.notTerm(), tm.mkTerm(Kind.APPLY_UF, g, bTrue).notTerm()))
|
|
|
|
|
assert solver.checkSat().isUnsat()
|
|
|
|
|
solver.pop()
|
|
|
|
|
# (assert (or (not f) (not (g true))))
|
|
|
|
|
solver.assertFormula(tm.mkTerm(
|
|
|
|
|
Kind.OR, f.notTerm(), tm.mkTerm(Kind.APPLY_UF, g, bTrue).notTerm()))
|
|
|
|
|
assert solver.checkSat().isUnsat()
|
|
|
|
|
|
|
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
2025-04-15 18:39:01 -07:00
|
|
|
bb = ttm.mkVar(ttm.getBooleanSort(), "b")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunRec(
|
|
|
|
|
tm.mkConst(
|
|
|
|
|
tm.mkFunctionSort({tm.getBooleanSort()}, tm.getBooleanSort()),
|
|
|
|
|
"g"),
|
|
|
|
|
[bb],
|
|
|
|
|
bb,
|
|
|
|
|
True)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunRec(
|
|
|
|
|
ttm.mkConst(
|
|
|
|
|
ttm.mkFunctionSort({ttm.getBooleanSort()}, ttm.getBooleanSort()),
|
|
|
|
|
"g"),
|
|
|
|
|
[b],
|
|
|
|
|
b,
|
|
|
|
|
True)
|
2022-05-10 10:47:52 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_define_funs_rec(tm, solver):
|
|
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
bvSort = tm.mkBitVectorSort(32)
|
|
|
|
|
funSort1 = tm.mkFunctionSort([bvSort, bvSort], bvSort)
|
|
|
|
|
funSort2 = tm.mkFunctionSort([uSort], tm.getIntegerSort())
|
|
|
|
|
b1 = tm.mkVar(bvSort, "b1")
|
|
|
|
|
b11 = tm.mkVar(bvSort, "b1")
|
|
|
|
|
b2 = tm.mkVar(tm.getIntegerSort(), "b2")
|
|
|
|
|
b3 = tm.mkVar(funSort2, "b3")
|
|
|
|
|
b4 = tm.mkVar(uSort, "b4")
|
|
|
|
|
v1 = tm.mkConst(bvSort, "v1")
|
|
|
|
|
v2 = tm.mkConst(tm.getIntegerSort(), "v2")
|
|
|
|
|
v3 = tm.mkConst(funSort2, "v3")
|
|
|
|
|
v4 = tm.mkConst(uSort, "v4")
|
|
|
|
|
f1 = tm.mkConst(funSort1, "f1")
|
|
|
|
|
f2 = tm.mkConst(funSort2, "f2")
|
|
|
|
|
f3 = tm.mkConst(bvSort, "f3")
|
|
|
|
|
solver.defineFunsRec([f1, f2], [[b1, b11], [b4]], [v1, v2])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunsRec([f1, f2], [[v1, b11], [b4]], [v1, v2])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunsRec([f1, f3], [[b1, b11], [b4]], [v1, v2])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunsRec([f1, f2], [[b1], [b4]], [v1, v2])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunsRec([f1, f2], [[b1, b2], [b4]], [v1, v2])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunsRec([f1, f2], [[b1, b11], [b4]], [v1, v4])
|
2022-05-10 10:47:52 -07:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
2025-04-15 18:39:01 -07:00
|
|
|
bb = ttm.mkVar(ttm.getBooleanSort(), "b")
|
2024-03-18 13:20:34 -07:00
|
|
|
uSort2 = ttm.mkUninterpretedSort("u")
|
|
|
|
|
bvSort2 = ttm.mkBitVectorSort(32)
|
|
|
|
|
funSort12 = ttm.mkFunctionSort([bvSort2, bvSort2], bvSort2)
|
|
|
|
|
funSort22 = ttm.mkFunctionSort([uSort2], ttm.getIntegerSort())
|
|
|
|
|
b12 = ttm.mkVar(bvSort2, "b1")
|
|
|
|
|
b112 = ttm.mkVar(bvSort2, "b1")
|
|
|
|
|
b42 = ttm.mkVar(uSort2, "b4")
|
|
|
|
|
v12 = ttm.mkConst(bvSort2, "v1")
|
|
|
|
|
v22 = ttm.mkConst(ttm.getIntegerSort(), "v2")
|
|
|
|
|
f12 = ttm.mkConst(funSort12, "f1")
|
|
|
|
|
f22 = ttm.mkConst(funSort22, "f2")
|
2024-03-14 14:34:58 -07:00
|
|
|
slv.defineFunsRec([f12, f22], [[b12, b112], [b42]], [v12, v22])
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunsRec([f1, f22], [[b12, b112], [b42]], [v12, v22])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunsRec([f12, f22], [[b1, b112], [b42]], [v12, v22])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunsRec([f12, f22], [[b12, b11], [b42]], [v12, v22])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunsRec([f12, f22], [[b12, b112], [b42]], [v1, v22])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunsRec([f12, f22], [[b12, b112], [b42]], [v12, v2])
|
2024-03-14 14:34:58 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunsRec([f12, f2], [[b12, b112], [b42]], [v12, v22])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.defineFunsRec([f12, f22], [[b12, b112], [b4]], [v12, v22])
|
2022-05-10 10:47:52 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_define_funs_rec_wrong_logic(tm, solver):
|
2022-05-10 10:47:52 -07:00
|
|
|
solver.setLogic("QF_BV")
|
2024-03-14 14:34:58 -07:00
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
bvSort = tm.mkBitVectorSort(32)
|
|
|
|
|
funSort1 = tm.mkFunctionSort([bvSort, bvSort], bvSort)
|
|
|
|
|
funSort2 = tm.mkFunctionSort([uSort], tm.getIntegerSort())
|
|
|
|
|
b = tm.mkVar(bvSort, "b")
|
|
|
|
|
u = tm.mkVar(uSort, "u")
|
|
|
|
|
v1 = tm.mkConst(bvSort, "v1")
|
|
|
|
|
v2 = tm.mkConst(tm.getIntegerSort(), "v2")
|
|
|
|
|
f1 = tm.mkConst(funSort1, "f1")
|
|
|
|
|
f2 = tm.mkConst(funSort2, "f2")
|
2022-05-10 10:47:52 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.defineFunsRec([f1, f2], [[b, b], [u]], [v1, v2])
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_define_funs_rec_global(tm, solver):
|
|
|
|
|
bSort = tm.getBooleanSort()
|
|
|
|
|
fSort = tm.mkFunctionSort([bSort], bSort)
|
2022-05-10 10:47:52 -07:00
|
|
|
|
|
|
|
|
solver.push()
|
2024-03-14 14:34:58 -07:00
|
|
|
bTrue = tm.mkBoolean(True)
|
|
|
|
|
b = tm.mkVar(bSort, "b")
|
|
|
|
|
gSym = tm.mkConst(fSort, "g")
|
2022-05-10 10:47:52 -07:00
|
|
|
# (define-funs-rec ((g ((b Bool)) Bool)) (b))
|
|
|
|
|
solver.defineFunsRec([gSym], [[b]], [b], True)
|
|
|
|
|
|
|
|
|
|
# (assert (not (g true)))
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.assertFormula(tm.mkTerm(Kind.APPLY_UF, gSym, bTrue).notTerm())
|
2022-05-10 10:47:52 -07:00
|
|
|
assert solver.checkSat().isUnsat()
|
|
|
|
|
solver.pop()
|
|
|
|
|
# (assert (not (g true)))
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.assertFormula(tm.mkTerm(Kind.APPLY_UF, gSym, bTrue).notTerm())
|
2022-05-10 10:47:52 -07:00
|
|
|
assert solver.checkSat().isUnsat()
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_assertions(tm, solver):
|
|
|
|
|
a = tm.mkConst(tm.getBooleanSort(), 'a')
|
|
|
|
|
b = tm.mkConst(tm.getBooleanSort(), 'b')
|
2022-05-02 14:08:58 -07:00
|
|
|
solver.assertFormula(a)
|
|
|
|
|
solver.assertFormula(b)
|
|
|
|
|
asserts = [a,b]
|
|
|
|
|
assert solver.getAssertions() == asserts
|
|
|
|
|
|
|
|
|
|
|
2021-05-18 10:11:16 -07:00
|
|
|
def test_get_info(solver):
|
|
|
|
|
solver.getInfo("name")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getInfo("asdf")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_option(solver):
|
2022-03-23 20:53:18 +01:00
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
assert solver.getOption("incremental") == "true"
|
2021-05-18 10:11:16 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getOption("asdf")
|
|
|
|
|
|
|
|
|
|
|
2022-03-23 20:53:18 +01:00
|
|
|
def test_get_option_names(solver):
|
|
|
|
|
opts = solver.getOptionNames()
|
|
|
|
|
assert len(opts) > 100
|
|
|
|
|
assert "verbose" in opts
|
|
|
|
|
assert "foobar" not in opts
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_option_info(solver):
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getOptionInfo("asdf-invalid")
|
2023-09-27 17:24:17 -03:00
|
|
|
|
2022-03-23 20:53:18 +01:00
|
|
|
info = solver.getOptionInfo("verbose")
|
|
|
|
|
assert info['name'] == "verbose"
|
2025-09-08 10:47:59 -03:00
|
|
|
assert info['category'] == OptionCategory.COMMON
|
2022-03-23 20:53:18 +01:00
|
|
|
assert info['aliases'] == []
|
|
|
|
|
assert not info['setByUser']
|
|
|
|
|
assert info['type'] is None
|
2023-09-27 17:24:17 -03:00
|
|
|
|
2022-03-23 20:53:18 +01:00
|
|
|
info = solver.getOptionInfo("print-success")
|
|
|
|
|
assert info['name'] == "print-success"
|
2025-09-08 10:47:59 -03:00
|
|
|
assert info['category'] == OptionCategory.COMMON
|
2022-03-23 20:53:18 +01:00
|
|
|
assert info['aliases'] == []
|
|
|
|
|
assert not info['setByUser']
|
|
|
|
|
assert info['type'] is bool
|
|
|
|
|
assert info['current'] == False
|
|
|
|
|
assert info['default'] == False
|
|
|
|
|
|
|
|
|
|
info = solver.getOptionInfo("verbosity")
|
|
|
|
|
assert info['name'] == "verbosity"
|
2025-09-08 10:47:59 -03:00
|
|
|
assert info['category'] == OptionCategory.COMMON
|
2022-03-23 20:53:18 +01:00
|
|
|
assert info['aliases'] == []
|
|
|
|
|
assert not info['setByUser']
|
|
|
|
|
assert info['type'] is int
|
|
|
|
|
assert info['current'] == 0
|
|
|
|
|
assert info['default'] == 0
|
|
|
|
|
assert info['minimum'] is None and info['maximum'] is None
|
|
|
|
|
|
|
|
|
|
info = solver.getOptionInfo("rlimit")
|
|
|
|
|
assert info['name'] == "rlimit"
|
2025-09-08 10:47:59 -03:00
|
|
|
assert info['category'] == OptionCategory.COMMON
|
2022-03-23 20:53:18 +01:00
|
|
|
assert info['aliases'] == []
|
|
|
|
|
assert not info['setByUser']
|
|
|
|
|
assert info['type'] is int
|
|
|
|
|
assert info['current'] == 0
|
|
|
|
|
assert info['default'] == 0
|
|
|
|
|
assert info['minimum'] is None and info['maximum'] is None
|
|
|
|
|
|
|
|
|
|
info = solver.getOptionInfo("random-freq")
|
|
|
|
|
assert info['name'] == "random-freq"
|
2025-09-08 10:47:59 -03:00
|
|
|
assert info['category'] == OptionCategory.EXPERT
|
2022-03-23 20:53:18 +01:00
|
|
|
assert info['aliases'] == ["random-frequency"]
|
|
|
|
|
assert not info['setByUser']
|
|
|
|
|
assert info['type'] is float
|
|
|
|
|
assert info['current'] == 0.0
|
|
|
|
|
assert info['default'] == 0.0
|
|
|
|
|
assert info['minimum'] == 0.0 and info['maximum'] == 1.0
|
|
|
|
|
|
|
|
|
|
info = solver.getOptionInfo("force-logic")
|
|
|
|
|
assert info['name'] == "force-logic"
|
2025-09-08 10:47:59 -03:00
|
|
|
assert info['category'] == OptionCategory.COMMON
|
2022-03-23 20:53:18 +01:00
|
|
|
assert info['aliases'] == []
|
|
|
|
|
assert not info['setByUser']
|
|
|
|
|
assert info['type'] is str
|
|
|
|
|
assert info['current'] == ""
|
|
|
|
|
assert info['default'] == ""
|
|
|
|
|
|
|
|
|
|
info = solver.getOptionInfo("simplification")
|
|
|
|
|
assert info['name'] == "simplification"
|
2025-09-08 10:47:59 -03:00
|
|
|
assert info['category'] == OptionCategory.REGULAR
|
2022-03-23 20:53:18 +01:00
|
|
|
assert info['aliases'] == ["simplification-mode"]
|
|
|
|
|
assert not info['setByUser']
|
|
|
|
|
assert info['type'] == 'mode'
|
|
|
|
|
assert info['current'] == 'batch'
|
|
|
|
|
assert info['default'] == 'batch'
|
|
|
|
|
assert info['modes'] == ['batch', 'none']
|
|
|
|
|
|
|
|
|
|
|
2021-05-18 10:11:16 -07:00
|
|
|
def test_get_unsat_assumptions1(solver):
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.checkSatAssuming(solver.mkFalse())
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getUnsatAssumptions()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_unsat_assumptions2(solver):
|
|
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
solver.setOption("produce-unsat-assumptions", "false")
|
|
|
|
|
solver.checkSatAssuming(solver.mkFalse())
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getUnsatAssumptions()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_unsat_assumptions3(solver):
|
|
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
solver.setOption("produce-unsat-assumptions", "true")
|
|
|
|
|
solver.checkSatAssuming(solver.mkFalse())
|
|
|
|
|
solver.getUnsatAssumptions()
|
|
|
|
|
solver.checkSatAssuming(solver.mkTrue())
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getUnsatAssumptions()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_unsat_core1(solver):
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.assertFormula(solver.mkFalse())
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getUnsatCore()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_unsat_core2(solver):
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-unsat-cores", "false")
|
|
|
|
|
solver.assertFormula(solver.mkFalse())
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getUnsatCore()
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_unsat_core_and_proof(tm, solver):
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
solver.setOption("produce-unsat-cores", "true")
|
2022-03-08 14:02:50 -08:00
|
|
|
solver.setOption("produce-proofs", "true");
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
uSort = solver.mkUninterpretedSort("u")
|
2024-03-14 14:34:58 -07:00
|
|
|
intSort = tm.getIntegerSort()
|
2021-05-19 13:08:54 -07:00
|
|
|
boolSort = solver.getBooleanSort()
|
|
|
|
|
uToIntSort = solver.mkFunctionSort(uSort, intSort)
|
|
|
|
|
intPredSort = solver.mkFunctionSort(intSort, boolSort)
|
|
|
|
|
|
|
|
|
|
x = solver.mkConst(uSort, "x")
|
|
|
|
|
y = solver.mkConst(uSort, "y")
|
|
|
|
|
f = solver.mkConst(uToIntSort, "f")
|
|
|
|
|
p = solver.mkConst(intPredSort, "p")
|
|
|
|
|
zero = solver.mkInteger(0)
|
|
|
|
|
one = solver.mkInteger(1)
|
2022-04-01 12:45:36 -07:00
|
|
|
f_x = solver.mkTerm(Kind.APPLY_UF, f, x)
|
|
|
|
|
f_y = solver.mkTerm(Kind.APPLY_UF, f, y)
|
|
|
|
|
summ = solver.mkTerm(Kind.ADD, f_x, f_y)
|
|
|
|
|
p_0 = solver.mkTerm(Kind.APPLY_UF, p, zero)
|
|
|
|
|
p_f_y = solver.mkTerm(Kind.APPLY_UF, p, f_y)
|
|
|
|
|
solver.assertFormula(solver.mkTerm(Kind.GT, zero, f_x))
|
|
|
|
|
solver.assertFormula(solver.mkTerm(Kind.GT, zero, f_y))
|
|
|
|
|
solver.assertFormula(solver.mkTerm(Kind.GT, summ, one))
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.assertFormula(p_0)
|
|
|
|
|
solver.assertFormula(p_f_y.notTerm())
|
|
|
|
|
assert solver.checkSat().isUnsat()
|
|
|
|
|
|
|
|
|
|
unsat_core = solver.getUnsatCore()
|
2023-08-22 11:17:16 -07:00
|
|
|
|
2022-08-05 13:00:05 -05:00
|
|
|
solver.getProof()
|
2023-08-22 11:17:16 -07:00
|
|
|
solver.getProof(ProofComponent.SAT)
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
solver.resetAssertions()
|
|
|
|
|
for t in unsat_core:
|
|
|
|
|
solver.assertFormula(t)
|
|
|
|
|
res = solver.checkSat()
|
|
|
|
|
assert res.isUnsat()
|
2022-03-08 14:02:50 -08:00
|
|
|
solver.getProof()
|
2021-05-19 13:08:54 -07:00
|
|
|
|
2023-10-12 12:05:01 -05:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_unsat_core_and_proof_to_string(tm, solver):
|
2024-08-20 11:08:01 -05:00
|
|
|
solver.setOption("produce-proofs", "true")
|
2023-10-12 12:05:01 -05:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
boolSort = tm.getBooleanSort()
|
|
|
|
|
uToIntSort = tm.mkFunctionSort(uSort, intSort)
|
|
|
|
|
intPredSort = tm.mkFunctionSort(intSort, boolSort)
|
2023-10-12 12:05:01 -05:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(uSort, "x")
|
|
|
|
|
y = tm.mkConst(uSort, "y")
|
|
|
|
|
f = tm.mkConst(uToIntSort, "f")
|
|
|
|
|
p = tm.mkConst(intPredSort, "p")
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
one = tm.mkInteger(1)
|
|
|
|
|
f_x = tm.mkTerm(Kind.APPLY_UF, f, x)
|
|
|
|
|
f_y = tm.mkTerm(Kind.APPLY_UF, f, y)
|
|
|
|
|
summ = tm.mkTerm(Kind.ADD, f_x, f_y)
|
|
|
|
|
p_0 = tm.mkTerm(Kind.APPLY_UF, p, zero)
|
|
|
|
|
p_f_y = tm.mkTerm(Kind.APPLY_UF, p, f_y)
|
|
|
|
|
solver.assertFormula(tm.mkTerm(Kind.GT, zero, f_x))
|
|
|
|
|
solver.assertFormula(tm.mkTerm(Kind.GT, zero, f_y))
|
|
|
|
|
solver.assertFormula(tm.mkTerm(Kind.GT, summ, one))
|
2023-10-12 12:05:01 -05:00
|
|
|
solver.assertFormula(p_0)
|
|
|
|
|
solver.assertFormula(p_f_y.notTerm())
|
|
|
|
|
assert solver.checkSat().isUnsat()
|
|
|
|
|
|
|
|
|
|
proofs = solver.getProof()
|
|
|
|
|
assert len(proofs) > 0
|
|
|
|
|
printedProof = solver.proofToString(proofs[0])
|
|
|
|
|
assert len(printedProof) > 0
|
|
|
|
|
printedProof = solver.proofToString(proofs[0], ProofFormat.ALETHE)
|
|
|
|
|
assert len(printedProof) > 0
|
2024-03-14 14:34:58 -07:00
|
|
|
|
2023-10-12 12:05:01 -05:00
|
|
|
proofs = solver.getProof(ProofComponent.SAT)
|
2023-12-19 17:01:25 -06:00
|
|
|
printedProof = solver.proofToString(proofs[0], ProofFormat.NONE)
|
2023-10-12 12:05:01 -05:00
|
|
|
assert len(printedProof) > 0
|
|
|
|
|
|
2024-08-20 11:08:01 -05:00
|
|
|
|
|
|
|
|
def test_proof_to_string_assertion_names(tm, solver):
|
|
|
|
|
solver.setOption("produce-proofs", "true")
|
|
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
x = tm.mkConst(uSort, "x")
|
|
|
|
|
y = tm.mkConst(uSort, "y")
|
|
|
|
|
|
|
|
|
|
x_eq_y = tm.mkTerm(Kind.EQUAL, x, y)
|
|
|
|
|
not_x_eq_y = tm.mkTerm(Kind.NOT, x_eq_y)
|
|
|
|
|
|
|
|
|
|
names = {x_eq_y: "as1", not_x_eq_y: "as2"}
|
|
|
|
|
|
|
|
|
|
solver.assertFormula(x_eq_y)
|
|
|
|
|
solver.assertFormula(not_x_eq_y)
|
|
|
|
|
|
|
|
|
|
assert solver.checkSat().isUnsat()
|
|
|
|
|
|
|
|
|
|
proofs = solver.getProof()
|
|
|
|
|
assert len(proofs) > 0
|
|
|
|
|
printedProof = solver.proofToString(proofs[0], ProofFormat.ALETHE, names)
|
|
|
|
|
assert len(printedProof) > 0
|
|
|
|
|
assert b"as1" in printedProof
|
|
|
|
|
assert b"as2" in printedProof
|
|
|
|
|
|
|
|
|
|
|
2022-03-04 08:37:54 -06:00
|
|
|
def test_learned_literals(solver):
|
|
|
|
|
solver.setOption("produce-learned-literals", "true")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2022-08-05 13:00:05 -05:00
|
|
|
solver.getLearnedLiterals()
|
2022-03-04 08:37:54 -06:00
|
|
|
solver.checkSat()
|
2022-08-05 13:00:05 -05:00
|
|
|
solver.getLearnedLiterals()
|
2023-08-22 11:17:16 -07:00
|
|
|
solver.getLearnedLiterals(LearnedLitType.PREPROCESS)
|
2022-03-04 08:37:54 -06:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_learned_literals2(tm, solver):
|
2022-03-04 08:37:54 -06:00
|
|
|
solver.setOption("produce-learned-literals", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
x = tm.mkConst(intSort, "x")
|
|
|
|
|
y = tm.mkConst(intSort, "y")
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
ten = tm.mkInteger(10)
|
|
|
|
|
f0 = tm.mkTerm(Kind.GEQ, x, ten)
|
|
|
|
|
f1 = tm.mkTerm(
|
2022-04-01 12:45:36 -07:00
|
|
|
Kind.OR,
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(Kind.GEQ, zero, x),
|
|
|
|
|
tm.mkTerm(Kind.GEQ, y, zero))
|
2022-03-04 08:37:54 -06:00
|
|
|
solver.assertFormula(f0)
|
|
|
|
|
solver.assertFormula(f1)
|
|
|
|
|
solver.checkSat()
|
2023-08-22 11:17:16 -07:00
|
|
|
solver.getLearnedLiterals(LearnedLitType.INPUT)
|
2022-03-04 08:37:54 -06:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_timeout_core_unsat(tm, solver):
|
2023-04-17 08:11:39 -05:00
|
|
|
solver.setOption("timeout-core-timeout", "100")
|
2023-06-20 10:09:57 -05:00
|
|
|
solver.setOption("produce-unsat-cores", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
x = tm.mkConst(intSort, "x")
|
|
|
|
|
tt = tm.mkBoolean(True)
|
|
|
|
|
hard = tm.mkTerm(Kind.EQUAL,
|
|
|
|
|
tm.mkTerm(Kind.MULT, x, x),
|
|
|
|
|
tm.mkInteger("501240912901901249014210220059591"))
|
2023-04-17 08:11:39 -05:00
|
|
|
solver.assertFormula(tt)
|
|
|
|
|
solver.assertFormula(hard)
|
|
|
|
|
res = solver.getTimeoutCore()
|
|
|
|
|
assert res[0].isUnknown()
|
|
|
|
|
assert len(res[1]) == 1
|
|
|
|
|
assert res[1][0] == hard
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_timeout_core(tm, solver):
|
2023-06-20 10:09:57 -05:00
|
|
|
solver.setOption("produce-unsat-cores", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
ff = tm.mkBoolean(False)
|
|
|
|
|
tt = tm.mkBoolean(True)
|
2023-04-17 08:11:39 -05:00
|
|
|
solver.assertFormula(tt)
|
|
|
|
|
solver.assertFormula(ff)
|
|
|
|
|
solver.assertFormula(tt)
|
|
|
|
|
res = solver.getTimeoutCore()
|
|
|
|
|
assert res[0].isUnsat()
|
|
|
|
|
assert len(res[1]) == 1
|
|
|
|
|
assert res[1][0] == ff
|
2021-05-19 13:08:54 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_timeout_core_assuming(tm, solver):
|
2023-11-02 10:53:34 -05:00
|
|
|
solver.setOption("produce-unsat-cores", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
ff = tm.mkBoolean(False)
|
|
|
|
|
tt = tm.mkBoolean(True)
|
2023-11-02 10:53:34 -05:00
|
|
|
solver.assertFormula(tt)
|
|
|
|
|
res = solver.getTimeoutCoreAssuming(ff, tt)
|
|
|
|
|
assert res[0].isUnsat()
|
|
|
|
|
assert len(res[1]) == 1
|
|
|
|
|
assert res[1][0] == ff
|
2024-03-14 14:34:58 -07:00
|
|
|
|
2023-11-02 10:53:34 -05:00
|
|
|
def test_get_timeout_core_assuming_empty(solver):
|
|
|
|
|
solver.setOption("produce-unsat-cores", "true")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
res = solver.getTimeoutCoreAssuming()
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value1(tm, solver):
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setOption("produce-models", "false")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkTrue()
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getValue(t)
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value2(tm, solver):
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkFalse()
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getValue(t)
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value3(tm, solver):
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
boolSort = tm.getBooleanSort()
|
|
|
|
|
uToIntSort = tm.mkFunctionSort(uSort, intSort)
|
|
|
|
|
intPredSort = tm.mkFunctionSort(intSort, boolSort)
|
2021-05-19 13:08:54 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(uSort, "x")
|
|
|
|
|
y = tm.mkConst(uSort, "y")
|
|
|
|
|
z = tm.mkConst(uSort, "z")
|
|
|
|
|
f = tm.mkConst(uToIntSort, "f")
|
|
|
|
|
p = tm.mkConst(intPredSort, "p")
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
one = tm.mkInteger(1)
|
|
|
|
|
f_x = tm.mkTerm(Kind.APPLY_UF, f, x)
|
|
|
|
|
f_y = tm.mkTerm(Kind.APPLY_UF, f, y)
|
|
|
|
|
summ = tm.mkTerm(Kind.ADD, f_x, f_y)
|
|
|
|
|
p_0 = tm.mkTerm(Kind.APPLY_UF, p, zero)
|
|
|
|
|
p_f_y = tm.mkTerm(Kind.APPLY_UF, p, f_y)
|
2021-05-19 13:08:54 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.assertFormula(tm.mkTerm(Kind.LEQ, zero, f_x))
|
|
|
|
|
solver.assertFormula(tm.mkTerm(Kind.LEQ, zero, f_y))
|
|
|
|
|
solver.assertFormula(tm.mkTerm(Kind.LEQ, summ, one))
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.assertFormula(p_0.notTerm())
|
|
|
|
|
solver.assertFormula(p_f_y)
|
|
|
|
|
assert solver.checkSat().isSat()
|
|
|
|
|
solver.getValue(x)
|
|
|
|
|
solver.getValue(y)
|
|
|
|
|
solver.getValue(z)
|
|
|
|
|
solver.getValue(summ)
|
|
|
|
|
solver.getValue(p_f_y)
|
|
|
|
|
|
2022-05-02 14:08:58 -07:00
|
|
|
a = [solver.getValue(x), solver.getValue(y), solver.getValue(z)]
|
|
|
|
|
b = solver.getValue([x,y,z])
|
|
|
|
|
assert a == b
|
|
|
|
|
|
2021-05-19 13:08:54 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
2024-03-18 13:20:34 -07:00
|
|
|
Solver(tm).getValue(x)
|
|
|
|
|
|
|
|
|
|
slv = Solver(tm)
|
|
|
|
|
slv.setOption("produce-models", "true")
|
|
|
|
|
slv.checkSat()
|
|
|
|
|
slv.getValue(x)
|
|
|
|
|
|
|
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("produce-models", "true")
|
|
|
|
|
slv.checkSat()
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.getValue(tm.mkConst(tm.getBooleanSort(), "x"))
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_declare_sep_heap(tm, solver):
|
2021-06-02 10:16:26 -07:00
|
|
|
solver.setLogic("ALL")
|
2022-01-06 17:26:10 -06:00
|
|
|
solver.setOption("incremental", "false")
|
2024-03-14 14:34:58 -07:00
|
|
|
integer = tm.getIntegerSort()
|
2021-11-03 15:04:34 -07:00
|
|
|
solver.declareSepHeap(integer, integer)
|
2021-05-19 13:08:54 -07:00
|
|
|
# cannot declare separation logic heap more than once
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2021-11-03 15:04:34 -07:00
|
|
|
solver.declareSepHeap(integer, integer)
|
2021-05-19 13:08:54 -07:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
# no logic set yet
|
|
|
|
|
Solver(tm).declareSepHeap(tm.getIntegerSort(), tm.getIntegerSort())
|
|
|
|
|
|
|
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setLogic("ALL")
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.declareSepHeap(integer, ttm.getRealSort())
|
2024-03-18 13:20:34 -07:00
|
|
|
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setLogic("ALL");
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.declareSepHeap(ttm.getBooleanSort(), integer)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
# Helper function for test_get_separation_{heap,nil}_termX. Asserts and checks
|
|
|
|
|
# some simple separation logic constraints.
|
|
|
|
|
def checkSimpleSeparationConstraints(slv):
|
2024-03-14 14:34:58 -07:00
|
|
|
tm = slv.getTermManager()
|
|
|
|
|
integer = tm.getIntegerSort()
|
2021-05-19 13:08:54 -07:00
|
|
|
# declare the separation heap
|
2021-11-03 15:04:34 -07:00
|
|
|
slv.declareSepHeap(integer, integer)
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(integer, "x")
|
|
|
|
|
p = tm.mkConst(integer, "p")
|
|
|
|
|
heap = tm.mkTerm(Kind.SEP_PTO, p, x)
|
2021-05-19 13:08:54 -07:00
|
|
|
slv.assertFormula(heap)
|
2024-03-14 14:34:58 -07:00
|
|
|
nil = tm.mkSepNil(integer)
|
|
|
|
|
slv.assertFormula(nil.eqTerm(tm.mkInteger(5)))
|
2021-05-19 13:08:54 -07:00
|
|
|
slv.checkSat()
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value_sep_heap_1(tm, solver):
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setLogic("QF_BV")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkTrue()
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2021-11-03 15:04:34 -07:00
|
|
|
solver.getValueSepHeap()
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
2021-12-01 01:38:44 +02:00
|
|
|
def test_get_value_sep_heap_2(solver):
|
2021-06-02 10:16:26 -07:00
|
|
|
solver.setLogic("ALL")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "false")
|
|
|
|
|
checkSimpleSeparationConstraints(solver)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2021-11-03 15:04:34 -07:00
|
|
|
solver.getValueSepHeap()
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value_sep_heap_3(tm, solver):
|
2021-06-02 10:16:26 -07:00
|
|
|
solver.setLogic("ALL")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkFalse()
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2021-11-03 15:04:34 -07:00
|
|
|
solver.getValueSepHeap()
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value_sep_heap_4(tm, solver):
|
2021-06-02 10:16:26 -07:00
|
|
|
solver.setLogic("ALL")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkTrue()
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2021-11-03 15:04:34 -07:00
|
|
|
solver.getValueSepHeap()
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
2021-12-01 01:38:44 +02:00
|
|
|
def test_get_value_sep_heap_5(solver):
|
2021-06-02 10:16:26 -07:00
|
|
|
solver.setLogic("ALL")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
|
|
|
|
checkSimpleSeparationConstraints(solver)
|
2021-11-03 15:04:34 -07:00
|
|
|
solver.getValueSepHeap()
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value_sep_nil_1(tm, solver):
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setLogic("QF_BV")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkTrue()
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2021-11-03 15:04:34 -07:00
|
|
|
solver.getValueSepNil()
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
2021-12-01 01:38:44 +02:00
|
|
|
def test_get_value_sep_nil_2(solver):
|
2021-06-02 10:16:26 -07:00
|
|
|
solver.setLogic("ALL")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "false")
|
|
|
|
|
checkSimpleSeparationConstraints(solver)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2021-11-03 15:04:34 -07:00
|
|
|
solver.getValueSepNil()
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value_sep_nil_3(tm, solver):
|
2021-06-02 10:16:26 -07:00
|
|
|
solver.setLogic("ALL")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkFalse()
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2021-11-03 15:04:34 -07:00
|
|
|
solver.getValueSepNil()
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value_sep_nil_4(tm, solver):
|
2021-06-02 10:16:26 -07:00
|
|
|
solver.setLogic("ALL")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkTrue()
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2021-11-03 15:04:34 -07:00
|
|
|
solver.getValueSepNil()
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
2021-12-01 01:38:44 +02:00
|
|
|
def test_get_value_sep_nil_5(solver):
|
2021-06-02 10:16:26 -07:00
|
|
|
solver.setLogic("ALL")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
|
|
|
|
checkSimpleSeparationConstraints(solver)
|
2021-11-03 15:04:34 -07:00
|
|
|
solver.getValueSepNil()
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_push1(solver):
|
|
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
solver.push(1)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_push2(solver):
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.push(1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_pop1(solver):
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.pop(1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_pop2(solver):
|
|
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.pop(1)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_pop3(solver):
|
|
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
solver.push(1)
|
|
|
|
|
solver.pop(1)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.pop(1)
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_block_model1(tm, solver):
|
|
|
|
|
x = tm.mkConst(solver.getBooleanSort(), "x")
|
2022-04-01 09:26:14 -07:00
|
|
|
solver.assertFormula(x.eqTerm(x))
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2022-04-01 12:45:36 -07:00
|
|
|
solver.blockModel(BlockModelsMode.LITERALS)
|
2022-04-01 09:26:14 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_block_model2(tm, solver):
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(solver.getBooleanSort(), "x")
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.assertFormula(x.eqTerm(x))
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2022-04-01 12:45:36 -07:00
|
|
|
solver.blockModel(BlockModelsMode.LITERALS)
|
2022-02-24 16:32:18 -08:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_block_model3(tm, solver):
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(solver.getBooleanSort(), "x");
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.assertFormula(x.eqTerm(x))
|
|
|
|
|
solver.checkSat()
|
2022-04-01 12:45:36 -07:00
|
|
|
solver.blockModel(BlockModelsMode.LITERALS)
|
2022-02-24 16:32:18 -08:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_block_model_values1(tm, solver):
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(solver.getBooleanSort(), "x");
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.assertFormula(x.eqTerm(x))
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.blockModelValues([])
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.blockModelValues([tm.mkBoolean(False)])
|
2022-02-24 16:32:18 -08:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("produce-models", "true")
|
|
|
|
|
slv.checkSat()
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.blockModelValues([tm.mkFalse()])
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_block_model_values2(tm, solver):
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(solver.getBooleanSort(), "x")
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.assertFormula(x.eqTerm(x))
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
solver.blockModelValues([x])
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_block_model_values3(tm, solver):
|
|
|
|
|
x = tm.mkConst(solver.getBooleanSort(), "x")
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.assertFormula(x.eqTerm(x))
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.blockModelValues([x])
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_block_model_values4(tm, solver):
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(solver.getBooleanSort(), "x")
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.assertFormula(x.eqTerm(x))
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.blockModelValues([x])
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_block_model_values5(tm, solver):
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(solver.getBooleanSort(), "x")
|
2022-02-24 16:32:18 -08:00
|
|
|
solver.assertFormula(x.eqTerm(x))
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
solver.blockModelValues([x])
|
2021-05-19 13:08:54 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_instantiations(tm, solver):
|
|
|
|
|
iSort = tm.getIntegerSort()
|
2022-05-09 12:05:28 -05:00
|
|
|
boolSort = solver.getBooleanSort()
|
|
|
|
|
p = solver.declareFun("p", [iSort], boolSort)
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkVar(iSort, "x")
|
|
|
|
|
bvl = tm.mkTerm(Kind.VARIABLE_LIST, x)
|
|
|
|
|
app = tm.mkTerm(Kind.APPLY_UF, p, x)
|
|
|
|
|
q = tm.mkTerm(Kind.FORALL, bvl, app)
|
2022-05-09 12:05:28 -05:00
|
|
|
solver.assertFormula(q)
|
2024-03-14 14:34:58 -07:00
|
|
|
five = tm.mkInteger(5)
|
|
|
|
|
app2 = tm.mkTerm(Kind.NOT, tm.mkTerm(Kind.APPLY_UF, p, five))
|
2022-05-09 12:05:28 -05:00
|
|
|
solver.assertFormula(app2)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getInstantiations()
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
solver.getInstantiations()
|
|
|
|
|
|
2024-04-01 14:12:16 -07:00
|
|
|
def test_get_statistics(tm, solver):
|
|
|
|
|
# do some array reasoning to make sure we have a double statistics
|
|
|
|
|
s1 = tm.getIntegerSort()
|
|
|
|
|
s2 = tm.mkArraySort(s1, s1)
|
|
|
|
|
t1 = tm.mkConst(s1, "i")
|
|
|
|
|
t2 = tm.mkVar(s2, "a")
|
|
|
|
|
t3 = tm.mkTerm(Kind.SELECT, t2, t1)
|
2022-03-20 17:39:41 +01:00
|
|
|
solver.checkSat()
|
2024-04-01 14:12:16 -07:00
|
|
|
|
|
|
|
|
stats = solver.getStatistics()
|
|
|
|
|
|
|
|
|
|
assert not stats['global::totalTime']['internal']
|
|
|
|
|
assert not stats['global::totalTime']['default']
|
|
|
|
|
assert stats['global::totalTime']['value'][-2:] == 'ms' # ends with 'ms'
|
|
|
|
|
assert stats['resource::resourceUnitsUsed']['internal']
|
|
|
|
|
assert not stats['resource::resourceUnitsUsed']['default']
|
|
|
|
|
assert stats.get(True)['resource::resourceUnitsUsed']['internal']
|
|
|
|
|
assert not stats.get(True)['resource::resourceUnitsUsed']['default']
|
|
|
|
|
|
|
|
|
|
assert '' not in stats
|
|
|
|
|
assert len([s for s in stats]) > 0
|
|
|
|
|
|
|
|
|
|
for s in stats:
|
2024-07-12 18:36:56 -07:00
|
|
|
str(s)
|
2024-04-01 14:12:16 -07:00
|
|
|
if s[0] == 'theory::arrays::avgIndexListLength':
|
|
|
|
|
assert s[1]['internal']
|
|
|
|
|
assert s[1]['default']
|
|
|
|
|
assert isnan(s[1]['value'])
|
|
|
|
|
|
2022-03-20 17:39:41 +01:00
|
|
|
|
2021-12-01 01:38:44 +02:00
|
|
|
def test_set_info(solver):
|
2021-05-19 13:08:54 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.setInfo("cvc5-lagic", "QF_BV")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.setInfo("cvc2-logic", "QF_BV")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.setInfo("cvc5-logic", "asdf")
|
|
|
|
|
|
|
|
|
|
solver.setInfo("source", "asdf")
|
|
|
|
|
solver.setInfo("category", "asdf")
|
|
|
|
|
solver.setInfo("difficulty", "asdf")
|
|
|
|
|
solver.setInfo("filename", "asdf")
|
|
|
|
|
solver.setInfo("license", "asdf")
|
|
|
|
|
solver.setInfo("name", "asdf")
|
|
|
|
|
solver.setInfo("notes", "asdf")
|
|
|
|
|
|
|
|
|
|
solver.setInfo("smt-lib-version", "2")
|
|
|
|
|
solver.setInfo("smt-lib-version", "2.0")
|
|
|
|
|
solver.setInfo("smt-lib-version", "2.5")
|
|
|
|
|
solver.setInfo("smt-lib-version", "2.6")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.setInfo("smt-lib-version", ".0")
|
|
|
|
|
|
|
|
|
|
solver.setInfo("status", "sat")
|
|
|
|
|
solver.setInfo("status", "unsat")
|
|
|
|
|
solver.setInfo("status", "unknown")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.setInfo("status", "asdf")
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_simplify(tm, solver):
|
|
|
|
|
bvSort = tm.mkBitVectorSort(32)
|
|
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
funSort1 = tm.mkFunctionSort([bvSort, bvSort], bvSort)
|
|
|
|
|
funSort2 = tm.mkFunctionSort(uSort, tm.getIntegerSort())
|
|
|
|
|
consListSpec = tm.mkDatatypeDecl("list")
|
|
|
|
|
cons = tm.mkDatatypeConstructorDecl("cons")
|
|
|
|
|
cons.addSelector("head", tm.getIntegerSort())
|
2021-05-19 13:08:54 -07:00
|
|
|
cons.addSelectorSelf("tail")
|
|
|
|
|
consListSpec.addConstructor(cons)
|
2024-03-14 14:34:58 -07:00
|
|
|
nil = tm.mkDatatypeConstructorDecl("nil")
|
2021-05-19 13:08:54 -07:00
|
|
|
consListSpec.addConstructor(nil)
|
2024-03-14 14:34:58 -07:00
|
|
|
consListSort = tm.mkDatatypeSort(consListSpec)
|
2021-05-19 13:08:54 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(bvSort, "x")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(x)
|
2024-03-14 14:34:58 -07:00
|
|
|
a = tm.mkConst(bvSort, "a")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(a)
|
2024-03-14 14:34:58 -07:00
|
|
|
b = tm.mkConst(bvSort, "b")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(b)
|
2024-03-14 14:34:58 -07:00
|
|
|
x_eq_x = tm.mkTerm(Kind.EQUAL, x, x)
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(x_eq_x)
|
2024-03-14 14:34:58 -07:00
|
|
|
assert tm.mkTrue() != x_eq_x
|
|
|
|
|
assert tm.mkTrue() == solver.simplify(x_eq_x)
|
|
|
|
|
x_eq_b = tm.mkTerm(Kind.EQUAL, x, b)
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(x_eq_b)
|
2024-03-14 14:34:58 -07:00
|
|
|
assert tm.mkTrue() != x_eq_b
|
|
|
|
|
assert tm.mkTrue() != solver.simplify(x_eq_b)
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
2022-08-03 08:15:50 -07:00
|
|
|
slv.simplify(x)
|
2021-05-19 13:08:54 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
i1 = tm.mkConst(tm.getIntegerSort(), "i1")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(i1)
|
2024-03-14 14:34:58 -07:00
|
|
|
i2 = tm.mkTerm(Kind.MULT, i1, tm.mkInteger("23"))
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(i2)
|
|
|
|
|
assert i1 != i2
|
|
|
|
|
assert i1 != solver.simplify(i2)
|
2024-03-14 14:34:58 -07:00
|
|
|
i3 = tm.mkTerm(Kind.ADD, i1, tm.mkInteger(0))
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(i3)
|
|
|
|
|
assert i1 != i3
|
|
|
|
|
assert i1 == solver.simplify(i3)
|
|
|
|
|
|
|
|
|
|
consList = consListSort.getDatatype()
|
2024-03-14 14:34:58 -07:00
|
|
|
dt1 = tm.mkTerm(
|
2022-04-01 14:36:07 -07:00
|
|
|
Kind.APPLY_CONSTRUCTOR,
|
2022-04-02 11:57:50 -07:00
|
|
|
consList.getConstructor("cons").getTerm(),
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkInteger(0),
|
|
|
|
|
tm.mkTerm(
|
2022-04-01 14:36:07 -07:00
|
|
|
Kind.APPLY_CONSTRUCTOR,
|
2022-04-02 11:57:50 -07:00
|
|
|
consList.getConstructor("nil").getTerm()))
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(dt1)
|
2024-03-14 14:34:58 -07:00
|
|
|
dt2 = tm.mkTerm(
|
2022-04-01 18:53:15 -07:00
|
|
|
Kind.APPLY_SELECTOR,
|
2022-04-02 11:57:50 -07:00
|
|
|
consList["cons"].getSelector("head").getTerm(),
|
2022-04-01 18:53:15 -07:00
|
|
|
dt1)
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(dt2)
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
b1 = tm.mkVar(bvSort, "b1")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(b1)
|
2024-03-14 14:34:58 -07:00
|
|
|
b2 = tm.mkVar(bvSort, "b1")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(b2)
|
2024-03-14 14:34:58 -07:00
|
|
|
b3 = tm.mkVar(uSort, "b3")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(b3)
|
2024-03-14 14:34:58 -07:00
|
|
|
v1 = tm.mkConst(bvSort, "v1")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(v1)
|
2024-03-14 14:34:58 -07:00
|
|
|
v2 = tm.mkConst(tm.getIntegerSort(), "v2")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(v2)
|
2024-03-14 14:34:58 -07:00
|
|
|
f1 = tm.mkConst(funSort1, "f1")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(f1)
|
2024-03-14 14:34:58 -07:00
|
|
|
f2 = tm.mkConst(funSort2, "f2")
|
2021-05-19 13:08:54 -07:00
|
|
|
solver.simplify(f2)
|
|
|
|
|
solver.defineFunsRec([f1, f2], [[b1, b2], [b3]], [v1, v2])
|
|
|
|
|
solver.simplify(f1)
|
|
|
|
|
solver.simplify(f2)
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.simplify(x)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2024-05-14 10:28:52 -05:00
|
|
|
def test_simplify_apply_subs(tm, solver):
|
|
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
x = tm.mkConst(intSort, "x")
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
eq = tm.mkTerm(Kind.EQUAL, x, zero)
|
|
|
|
|
solver.assertFormula(eq)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
|
|
|
|
|
assert solver.simplify(x, False) == x
|
|
|
|
|
assert solver.simplify(x, True) == zero
|
2021-05-19 13:08:54 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_assert_formula(tm, solver):
|
|
|
|
|
solver.assertFormula(tm.mkTrue())
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
|
|
|
|
slv.assertFormula(tm.mkTrue())
|
|
|
|
|
|
|
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.assertFormula(tm.mkTrue())
|
2021-05-19 13:08:54 -07:00
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_check_sat(solver):
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.checkSat()
|
2021-05-19 15:15:45 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_check_sat_assuming(tm, solver):
|
2021-05-19 15:15:45 -07:00
|
|
|
solver.setOption("incremental", "false")
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.checkSatAssuming(tm.mkTrue())
|
2021-05-19 15:15:45 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.checkSatAssuming(tm.mkTrue())
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
|
|
|
|
slv.checkSatAssuming(tm.mkTrue())
|
|
|
|
|
|
|
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.checkSatAssuming(tm.mkTrue())
|
2021-05-19 15:15:45 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_check_sat_assuming1(tm, solver):
|
|
|
|
|
boolSort = tm.getBooleanSort()
|
|
|
|
|
x = tm.mkConst(boolSort, "x")
|
|
|
|
|
y = tm.mkConst(boolSort, "y")
|
|
|
|
|
z = tm.mkTerm(Kind.AND, x, y)
|
2021-05-19 15:15:45 -07:00
|
|
|
solver.setOption("incremental", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.checkSatAssuming(tm.mkTrue())
|
|
|
|
|
solver.checkSatAssuming(tm.mkTrue())
|
2021-05-19 15:15:45 -07:00
|
|
|
solver.checkSatAssuming(z)
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
2024-03-14 14:34:58 -07:00
|
|
|
slv.checkSatAssuming(tm.mkTrue())
|
2021-05-19 15:15:45 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_check_sat_assuming2(tm, solver):
|
2021-05-19 15:15:45 -07:00
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
intSort = tm.getIntegerSort()
|
2021-05-19 15:15:45 -07:00
|
|
|
boolSort = solver.getBooleanSort()
|
2024-03-14 14:34:58 -07:00
|
|
|
uToIntSort = tm.mkFunctionSort(uSort, intSort)
|
|
|
|
|
intPredSort = tm.mkFunctionSort(intSort, boolSort)
|
2021-05-19 15:15:45 -07:00
|
|
|
|
|
|
|
|
# Constants
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(uSort, "x")
|
|
|
|
|
y = tm.mkConst(uSort, "y")
|
2021-05-19 15:15:45 -07:00
|
|
|
# Functions
|
2024-03-14 14:34:58 -07:00
|
|
|
f = tm.mkConst(uToIntSort, "f")
|
|
|
|
|
p = tm.mkConst(intPredSort, "p")
|
2021-05-19 15:15:45 -07:00
|
|
|
# Values
|
2024-03-14 14:34:58 -07:00
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
one = tm.mkInteger(1)
|
2021-05-19 15:15:45 -07:00
|
|
|
# Terms
|
2024-03-14 14:34:58 -07:00
|
|
|
f_x = tm.mkTerm(Kind.APPLY_UF, f, x)
|
|
|
|
|
f_y = tm.mkTerm(Kind.APPLY_UF, f, y)
|
|
|
|
|
summ = tm.mkTerm(Kind.ADD, f_x, f_y)
|
|
|
|
|
p_0 = tm.mkTerm(Kind.APPLY_UF, p, zero)
|
|
|
|
|
p_f_y = tm.mkTerm(Kind.APPLY_UF, p, f_y)
|
2021-05-19 15:15:45 -07:00
|
|
|
# Assertions
|
|
|
|
|
assertions =\
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(Kind.AND,\
|
|
|
|
|
tm.mkTerm(Kind.LEQ, zero, f_x), # 0 <= f(x)
|
|
|
|
|
tm.mkTerm(Kind.LEQ, zero, f_y), # 0 <= f(y)
|
|
|
|
|
tm.mkTerm(Kind.LEQ, summ, one), # f(x) + f(y) <= 1
|
2021-05-19 15:15:45 -07:00
|
|
|
p_0.notTerm(), # not p(0)
|
|
|
|
|
p_f_y # p(f(y))
|
2022-04-01 18:58:00 +02:00
|
|
|
)
|
2021-05-19 15:15:45 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.checkSatAssuming(tm.mkTrue())
|
2021-05-19 15:15:45 -07:00
|
|
|
solver.assertFormula(assertions)
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.checkSatAssuming(tm.mkTerm(Kind.DISTINCT, x, y))
|
2021-05-19 15:15:45 -07:00
|
|
|
solver.checkSatAssuming(
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkFalse(),
|
|
|
|
|
tm.mkTerm(Kind.DISTINCT, x, y))
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
2024-03-14 14:34:58 -07:00
|
|
|
slv.checkSatAssuming(tm.mkTrue())
|
2021-05-19 15:15:45 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_set_logic(tm, solver):
|
2021-05-19 15:15:45 -07:00
|
|
|
solver.setLogic("AUFLIRA")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.setLogic("AF_BV")
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.assertFormula(tm.mkTrue())
|
2021-05-19 15:15:45 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.setLogic("AUFLIRA")
|
|
|
|
|
|
2023-09-18 13:16:17 -05:00
|
|
|
def test_is_logic_set(solver):
|
|
|
|
|
assert solver.isLogicSet() == False
|
|
|
|
|
solver.setLogic("QF_BV")
|
|
|
|
|
assert solver.isLogicSet() == True
|
|
|
|
|
|
|
|
|
|
def test_get_logic(solver):
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getLogic()
|
|
|
|
|
solver.setLogic("QF_BV")
|
|
|
|
|
assert solver.getLogic() == "QF_BV"
|
2021-05-19 15:15:45 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_set_option(tm, solver):
|
2021-05-19 15:15:45 -07:00
|
|
|
solver.setOption("bv-sat-solver", "minisat")
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.setOption("bv-sat-solver", "1")
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.assertFormula(tm.mkTrue())
|
2021-05-19 15:15:45 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.setOption("bv-sat-solver", "minisat")
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_reset_assertions(tm, solver):
|
2021-05-19 15:15:45 -07:00
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
bvSort = tm.mkBitVectorSort(4)
|
|
|
|
|
one = tm.mkBitVector(4, 1)
|
|
|
|
|
x = tm.mkConst(bvSort, "x")
|
|
|
|
|
ule = tm.mkTerm(Kind.BITVECTOR_ULE, x, one)
|
|
|
|
|
srem = tm.mkTerm(Kind.BITVECTOR_SREM, one, x)
|
2021-05-19 15:15:45 -07:00
|
|
|
solver.push(4)
|
2024-03-14 14:34:58 -07:00
|
|
|
slt = tm.mkTerm(Kind.BITVECTOR_SLT, srem, one)
|
2021-05-19 15:15:45 -07:00
|
|
|
solver.resetAssertions()
|
2022-04-01 18:58:00 +02:00
|
|
|
solver.checkSatAssuming(slt, ule)
|
2021-05-19 15:15:45 -07:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
def test_declare_sygus_var(tm, solver):
|
|
|
|
|
solver.setOption("sygus", "true")
|
|
|
|
|
boolSort = tm.getBooleanSort()
|
|
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
funSort = tm.mkFunctionSort([intSort], boolSort)
|
|
|
|
|
|
|
|
|
|
solver.declareSygusVar("", boolSort)
|
|
|
|
|
solver.declareSygusVar("", funSort)
|
|
|
|
|
solver.declareSygusVar("b", boolSort)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.declareSygusVar("", cvc5.Sort())
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.declareSygusVar("a", cvc5.Sort())
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
Solver(tm).declareSygusVar("", boolSort)
|
|
|
|
|
|
|
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("sygus", "true")
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.declareSygusVar("", boolSort)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2021-05-19 15:15:45 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_mk_sygus_grammar(tm, solver):
|
|
|
|
|
boolTerm = tm.mkBoolean(True)
|
|
|
|
|
boolVar = tm.mkVar(solver.getBooleanSort())
|
|
|
|
|
intVar = tm.mkVar(tm.getIntegerSort())
|
2021-05-19 15:15:45 -07:00
|
|
|
|
2022-04-02 14:40:41 -05:00
|
|
|
solver.mkGrammar([], [intVar])
|
|
|
|
|
solver.mkGrammar([boolVar], [intVar])
|
2021-05-19 15:15:45 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
2022-04-02 14:40:41 -05:00
|
|
|
solver.mkGrammar([], [])
|
2021-05-19 15:15:45 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
2022-04-02 14:40:41 -05:00
|
|
|
solver.mkGrammar([], [boolTerm])
|
2021-05-19 15:15:45 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
2022-04-02 14:40:41 -05:00
|
|
|
solver.mkGrammar([boolTerm], [intVar])
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
2024-03-14 14:34:58 -07:00
|
|
|
boolVar2 = tm.mkVar(tm.getBooleanSort())
|
|
|
|
|
intVar2 = tm.mkVar(tm.getIntegerSort())
|
2022-04-02 14:40:41 -05:00
|
|
|
slv.mkGrammar([boolVar2], [intVar2])
|
2022-08-03 08:15:50 -07:00
|
|
|
slv.mkGrammar([boolVar], [intVar2])
|
|
|
|
|
slv.mkGrammar([boolVar2], [intVar])
|
2021-05-19 15:15:45 -07:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("sygus", "true")
|
2025-04-15 18:39:01 -07:00
|
|
|
boolVar2 = ttm.mkVar(ttm.getBooleanSort())
|
|
|
|
|
intVar2 = ttm.mkVar(ttm.getIntegerSort())
|
2024-03-18 13:20:34 -07:00
|
|
|
slv.mkGrammar([boolVar2], [intVar2])
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.mkGrammar([boolVar], [intVar2])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.mkGrammar([boolVar2], [intVar])
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2021-05-19 15:15:45 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_add_sygus_constraint(tm, solver):
|
2022-03-24 21:21:44 -05:00
|
|
|
solver.setOption("sygus", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
boolTerm = tm.mkBoolean(True)
|
|
|
|
|
intTerm = tm.mkInteger(1)
|
2021-05-19 15:15:45 -07:00
|
|
|
|
|
|
|
|
solver.addSygusConstraint(boolTerm)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.addSygusConstraint(intTerm)
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
2021-05-19 15:15:45 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.addSygusConstraint(boolTerm)
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("sygus", "true")
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.addSygusConstraint(boolTerm)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2023-02-02 15:08:28 -06:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_sygus_constraints(tm, solver):
|
2023-02-02 15:08:28 -06:00
|
|
|
solver.setOption("sygus", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
true_term = tm.mkBoolean(True)
|
|
|
|
|
false_term = tm.mkBoolean(False)
|
2023-02-02 15:08:28 -06:00
|
|
|
solver.addSygusConstraint(true_term)
|
|
|
|
|
solver.addSygusConstraint(false_term)
|
|
|
|
|
constraints = [true_term, false_term]
|
|
|
|
|
assert solver.getSygusConstraints() == constraints
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_add_sygus_assume(tm, solver):
|
2022-03-30 09:05:49 +03:00
|
|
|
solver.setOption("sygus", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
boolTerm = tm.mkBoolean(False)
|
|
|
|
|
intTerm = tm.mkInteger(1)
|
2022-03-30 09:05:49 +03:00
|
|
|
solver.addSygusAssume(boolTerm)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.addSygusAssume(intTerm)
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
2022-03-30 09:05:49 +03:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.addSygusAssume(boolTerm)
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("sygus", "true")
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.addSygusAssume(boolTerm)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2021-05-19 15:15:45 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_sygus_assumptions(tm, solver):
|
2023-02-02 15:08:28 -06:00
|
|
|
solver.setOption("sygus", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
true_term = tm.mkBoolean(True)
|
|
|
|
|
false_term = tm.mkBoolean(False)
|
2023-02-02 15:08:28 -06:00
|
|
|
solver.addSygusAssume(true_term)
|
|
|
|
|
solver.addSygusAssume(false_term)
|
|
|
|
|
assumptions = [true_term, false_term]
|
|
|
|
|
assert solver.getSygusAssumptions() == assumptions
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_add_sygus_inv_constraint(tm, solver):
|
2022-03-24 21:21:44 -05:00
|
|
|
solver.setOption("sygus", "true")
|
2021-05-19 15:15:45 -07:00
|
|
|
boolean = solver.getBooleanSort()
|
|
|
|
|
real = solver.getRealSort()
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
intTerm = tm.mkInteger(1)
|
2021-05-19 15:15:45 -07:00
|
|
|
|
|
|
|
|
inv = solver.declareFun("inv", [real], boolean)
|
|
|
|
|
pre = solver.declareFun("pre", [real], boolean)
|
|
|
|
|
trans = solver.declareFun("trans", [real, real], boolean)
|
|
|
|
|
post = solver.declareFun("post", [real], boolean)
|
|
|
|
|
|
|
|
|
|
inv1 = solver.declareFun("inv1", [real], real)
|
|
|
|
|
|
|
|
|
|
trans1 = solver.declareFun("trans1", [boolean, real], boolean)
|
|
|
|
|
trans2 = solver.declareFun("trans2", [real, boolean], boolean)
|
|
|
|
|
trans3 = solver.declareFun("trans3", [real, real], real)
|
|
|
|
|
|
|
|
|
|
solver.addSygusInvConstraint(inv, pre, trans, post)
|
|
|
|
|
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.addSygusInvConstraint(intTerm, pre, trans, post)
|
|
|
|
|
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.addSygusInvConstraint(inv1, pre, trans, post)
|
|
|
|
|
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.addSygusInvConstraint(inv, trans, trans, post)
|
|
|
|
|
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.addSygusInvConstraint(inv, pre, intTerm, post)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.addSygusInvConstraint(inv, pre, pre, post)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.addSygusInvConstraint(inv, pre, trans1, post)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.addSygusInvConstraint(inv, pre, trans2, post)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.addSygusInvConstraint(inv, pre, trans3, post)
|
|
|
|
|
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.addSygusInvConstraint(inv, pre, trans, trans)
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
2022-03-24 21:21:44 -05:00
|
|
|
slv.setOption("sygus", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
boolean2 = tm.getBooleanSort()
|
|
|
|
|
real2 = tm.getRealSort()
|
|
|
|
|
inv22 = solver.declareFun("inv", [real2], boolean2)
|
|
|
|
|
pre22 = solver.declareFun("pre", [real2], boolean2)
|
|
|
|
|
trans22 = solver.declareFun("trans", [real2, real2], boolean2)
|
|
|
|
|
post22 = solver.declareFun("post", [real2], boolean2)
|
2021-05-19 15:15:45 -07:00
|
|
|
slv.addSygusInvConstraint(inv22, pre22, trans22, post22)
|
2022-08-03 08:15:50 -07:00
|
|
|
slv.addSygusInvConstraint(inv, pre22, trans22, post22)
|
|
|
|
|
slv.addSygusInvConstraint(inv22, pre, trans22, post22)
|
|
|
|
|
slv.addSygusInvConstraint(inv22, pre22, trans, post22)
|
|
|
|
|
slv.addSygusInvConstraint(inv22, pre22, trans22, post)
|
2021-05-19 15:15:45 -07:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("sygus", "true")
|
2025-04-15 18:39:01 -07:00
|
|
|
boolean2 = ttm.getBooleanSort()
|
|
|
|
|
real2 = ttm.getRealSort()
|
2024-03-18 13:20:34 -07:00
|
|
|
inv22 = slv.declareFun("inv", [real2], boolean2)
|
|
|
|
|
pre22 = slv.declareFun("pre", [real2], boolean2)
|
|
|
|
|
trans22 = slv.declareFun("trans", [real2, real2], boolean2)
|
|
|
|
|
post22 = slv.declareFun("post", [real2], boolean2)
|
|
|
|
|
slv.addSygusInvConstraint(inv22, pre22, trans22, post22)
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.addSygusInvConstraint(inv, pre22, trans22, post22)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.addSygusInvConstraint(inv22, pre, trans22, post22)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.addSygusInvConstraint(inv22, pre22, trans, post22)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.addSygusInvConstraint(inv22, pre22, trans22, post)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2021-05-19 15:15:45 -07:00
|
|
|
|
2022-03-24 21:21:44 -05:00
|
|
|
def test_check_synth(solver):
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.checkSynth()
|
|
|
|
|
solver.setOption("sygus", "true")
|
|
|
|
|
solver.checkSynth()
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_synth_solution(tm, solver):
|
2022-03-24 21:21:44 -05:00
|
|
|
solver.setOption("sygus", "true")
|
2021-05-19 15:15:45 -07:00
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkBoolean(False)
|
2021-05-19 15:15:45 -07:00
|
|
|
f = solver.synthFun("f", [], solver.getBooleanSort())
|
|
|
|
|
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getSynthSolution(f)
|
|
|
|
|
|
2022-03-25 15:00:14 -05:00
|
|
|
res = solver.checkSynth()
|
|
|
|
|
assert res.hasSolution()
|
2021-05-19 15:15:45 -07:00
|
|
|
|
|
|
|
|
solver.getSynthSolution(f)
|
|
|
|
|
solver.getSynthSolution(f)
|
|
|
|
|
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getSynthSolution(x)
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
2021-05-19 15:15:45 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.getSynthSolution(f)
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2021-12-20 09:23:16 -06:00
|
|
|
def test_check_synth_next(solver):
|
2022-03-24 21:21:44 -05:00
|
|
|
solver.setOption("sygus", "true")
|
2021-12-20 09:23:16 -06:00
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
f = solver.synthFun("f", [], solver.getBooleanSort())
|
|
|
|
|
|
2022-03-25 15:00:14 -05:00
|
|
|
res = solver.checkSynth()
|
|
|
|
|
assert res.hasSolution()
|
2021-12-20 09:23:16 -06:00
|
|
|
solver.getSynthSolutions([f])
|
|
|
|
|
|
2022-03-25 15:00:14 -05:00
|
|
|
res = solver.checkSynthNext()
|
|
|
|
|
assert res.hasSolution()
|
2021-12-20 09:23:16 -06:00
|
|
|
solver.getSynthSolutions([f])
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2021-12-20 09:23:16 -06:00
|
|
|
def test_check_synth_next2(solver):
|
2022-03-24 21:21:44 -05:00
|
|
|
solver.setOption("sygus", "true")
|
2021-12-20 09:23:16 -06:00
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
f = solver.synthFun("f", [], solver.getBooleanSort())
|
|
|
|
|
|
|
|
|
|
solver.checkSynth()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.checkSynthNext()
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2021-12-20 09:23:16 -06:00
|
|
|
def test_check_synth_next3(solver):
|
2022-03-24 21:21:44 -05:00
|
|
|
solver.setOption("sygus", "true")
|
2021-12-20 09:23:16 -06:00
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
f = solver.synthFun("f", [], solver.getBooleanSort())
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.checkSynthNext()
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_find_synth(tm, solver):
|
2023-08-07 10:58:39 -05:00
|
|
|
solver.setOption("sygus", "true")
|
|
|
|
|
boolSort = solver.getBooleanSort()
|
2024-03-14 14:34:58 -07:00
|
|
|
start = tm.mkVar(boolSort)
|
2023-08-07 10:58:39 -05:00
|
|
|
g = solver.mkGrammar([], [start])
|
2024-03-14 14:34:58 -07:00
|
|
|
truen = tm.mkBoolean(True)
|
|
|
|
|
falsen = tm.mkBoolean(False)
|
2023-08-07 10:58:39 -05:00
|
|
|
g.addRule(start, truen)
|
|
|
|
|
g.addRule(start, falsen)
|
|
|
|
|
f = solver.synthFun("f", [], solver.getBooleanSort(), g)
|
|
|
|
|
|
|
|
|
|
# should enumerate based on the grammar of the function to synthesize above
|
2023-08-22 11:17:16 -07:00
|
|
|
t = solver.findSynth(FindSynthTarget.ENUM)
|
2023-08-07 10:58:39 -05:00
|
|
|
assert not t.isNull() and t.getSort().isBoolean()
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_find_synth2(tm, solver):
|
2023-08-07 10:58:39 -05:00
|
|
|
solver.setOption("sygus", "true")
|
|
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
boolSort = solver.getBooleanSort()
|
2024-03-14 14:34:58 -07:00
|
|
|
start = tm.mkVar(boolSort)
|
2023-08-07 10:58:39 -05:00
|
|
|
g = solver.mkGrammar([], [start])
|
2024-03-14 14:34:58 -07:00
|
|
|
truen = tm.mkBoolean(True)
|
|
|
|
|
falsen = tm.mkBoolean(False)
|
2023-08-07 10:58:39 -05:00
|
|
|
g.addRule(start, truen)
|
|
|
|
|
g.addRule(start, falsen)
|
|
|
|
|
|
|
|
|
|
# should enumerate true/false
|
2023-08-22 11:17:16 -07:00
|
|
|
t = solver.findSynth(FindSynthTarget.ENUM, g)
|
2023-08-07 10:58:39 -05:00
|
|
|
assert not t.isNull() and t.getSort().isBoolean()
|
|
|
|
|
t = solver.findSynthNext()
|
|
|
|
|
assert not t.isNull() and t.getSort().isBoolean()
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_abduct(tm, solver):
|
2022-01-04 17:18:41 +02:00
|
|
|
solver.setLogic("QF_LIA")
|
|
|
|
|
solver.setOption("produce-abducts", "true")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
x = tm.mkConst(intSort, "x")
|
|
|
|
|
y = tm.mkConst(intSort, "y")
|
2022-01-04 17:18:41 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.assertFormula(tm.mkTerm(Kind.GT, x, zero))
|
|
|
|
|
conj = tm.mkTerm(Kind.GT, y, zero)
|
2022-03-11 15:41:54 -06:00
|
|
|
output = solver.getAbduct(conj)
|
2022-01-04 17:18:41 +02:00
|
|
|
assert not output.isNull() and output.getSort().isBoolean()
|
|
|
|
|
|
|
|
|
|
boolean = solver.getBooleanSort()
|
2024-03-14 14:34:58 -07:00
|
|
|
truen = tm.mkBoolean(True)
|
|
|
|
|
start = tm.mkVar(boolean)
|
2022-04-02 14:40:41 -05:00
|
|
|
g = solver.mkGrammar([], [start])
|
2024-03-14 14:34:58 -07:00
|
|
|
conj2 = tm.mkTerm(Kind.GT, x, zero)
|
2022-01-04 17:18:41 +02:00
|
|
|
g.addRule(start, truen)
|
2022-03-11 15:41:54 -06:00
|
|
|
output2 = solver.getAbduct(conj2, g)
|
2022-01-04 17:18:41 +02:00
|
|
|
assert output2 == truen
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("produce-abducts", "true")
|
2025-04-15 18:39:01 -07:00
|
|
|
intSort2 = ttm.getIntegerSort()
|
|
|
|
|
xx = ttm.mkConst(intSort2, "x")
|
|
|
|
|
yy = ttm.mkConst(intSort2, "y")
|
2024-03-18 13:20:34 -07:00
|
|
|
zzero = ttm.mkInteger(0)
|
|
|
|
|
sstart = ttm.mkVar(ttm.getBooleanSort())
|
|
|
|
|
slv.assertFormula(
|
|
|
|
|
ttm.mkTerm(Kind.GT, ttm.mkTerm(Kind.ADD, xx, yy), zzero))
|
|
|
|
|
gg = slv.mkGrammar([], [sstart])
|
|
|
|
|
gg.addRule(sstart, ttm.mkTrue())
|
|
|
|
|
cconj2 = ttm.mkTerm(Kind.EQUAL, zzero, zzero)
|
|
|
|
|
slv.getAbduct(cconj2, gg)
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.getAbduct(conj2)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.getAbduct(conj2, gg)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.getAbduct(cconj2, g)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_abduct2(tm, solver):
|
2022-01-04 17:18:41 +02:00
|
|
|
solver.setLogic("QF_LIA")
|
|
|
|
|
solver.setOption("incremental", "false")
|
2024-03-14 14:34:58 -07:00
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
x = tm.mkConst(intSort, "x")
|
|
|
|
|
y = tm.mkConst(intSort, "y")
|
|
|
|
|
solver.assertFormula(tm.mkTerm(Kind.GT, x, zero))
|
|
|
|
|
conj = tm.mkTerm(Kind.GT, y, zero)
|
2022-01-04 17:18:41 +02:00
|
|
|
with pytest.raises(RuntimeError):
|
2022-03-11 15:41:54 -06:00
|
|
|
solver.getAbduct(conj)
|
2022-01-04 17:18:41 +02:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_abduct_next(tm, solver):
|
2022-01-04 17:18:41 +02:00
|
|
|
solver.setLogic("QF_LIA")
|
|
|
|
|
solver.setOption("produce-abducts", "true")
|
|
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
x = tm.mkConst(intSort, "x")
|
|
|
|
|
y = tm.mkConst(intSort, "y")
|
2022-01-04 17:18:41 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.assertFormula(tm.mkTerm(Kind.GT, x, zero))
|
|
|
|
|
conj = tm.mkTerm(Kind.GT, y, zero)
|
2022-03-11 15:41:54 -06:00
|
|
|
output = solver.getAbduct(conj)
|
|
|
|
|
output2 = solver.getAbductNext()
|
2022-01-04 17:18:41 +02:00
|
|
|
assert output != output2
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_interpolant(tm, solver):
|
2022-01-04 17:18:41 +02:00
|
|
|
solver.setLogic("QF_LIA")
|
2022-03-28 15:30:19 -07:00
|
|
|
solver.setOption("produce-interpolants", "true")
|
2022-01-04 17:18:41 +02:00
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
x = tm.mkConst(intSort, "x")
|
|
|
|
|
y = tm.mkConst(intSort, "y")
|
|
|
|
|
z = tm.mkConst(intSort, "z")
|
2022-01-04 17:18:41 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.assertFormula(tm.mkTerm(
|
|
|
|
|
Kind.GT, tm.mkTerm(Kind.ADD, x, y), zero))
|
|
|
|
|
solver.assertFormula(tm.mkTerm(Kind.LT, x, zero))
|
|
|
|
|
conj = tm.mkTerm(
|
2022-04-01 12:45:36 -07:00
|
|
|
Kind.OR,
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(Kind.GT, tm.mkTerm(Kind.ADD, y, z), zero),
|
|
|
|
|
tm.mkTerm(Kind.LT, z, zero))
|
2022-03-11 15:41:54 -06:00
|
|
|
output = solver.getInterpolant(conj)
|
2022-01-04 17:18:41 +02:00
|
|
|
assert output.getSort().isBoolean()
|
|
|
|
|
|
2022-05-17 06:40:32 -07:00
|
|
|
boolean = solver.getBooleanSort()
|
2024-03-14 14:34:58 -07:00
|
|
|
truen = tm.mkBoolean(True)
|
|
|
|
|
start = tm.mkVar(boolean)
|
2022-05-17 06:40:32 -07:00
|
|
|
g = solver.mkGrammar([], [start])
|
2024-03-14 14:34:58 -07:00
|
|
|
conj2 = tm.mkTerm(Kind.EQUAL, zero, zero)
|
2022-05-17 06:40:32 -07:00
|
|
|
g.addRule(start, truen)
|
|
|
|
|
output2 = solver.getInterpolant(conj2, g)
|
|
|
|
|
assert output2 == truen
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("produce-interpolants", "true")
|
2025-04-15 18:39:01 -07:00
|
|
|
intSort2 = ttm.getIntegerSort()
|
|
|
|
|
xx = ttm.mkConst(intSort2, "x")
|
|
|
|
|
yy = ttm.mkConst(intSort2, "y")
|
2024-03-18 13:20:34 -07:00
|
|
|
zzero = ttm.mkInteger(0)
|
|
|
|
|
sstart = ttm.mkVar(ttm.getBooleanSort())
|
|
|
|
|
slv.assertFormula(
|
|
|
|
|
ttm.mkTerm(Kind.GT, ttm.mkTerm(Kind.ADD, xx, yy), zzero))
|
|
|
|
|
gg = slv.mkGrammar([], [sstart])
|
|
|
|
|
gg.addRule(sstart, ttm.mkTrue())
|
|
|
|
|
cconj2 = ttm.mkTerm(Kind.EQUAL, zzero, zzero)
|
|
|
|
|
slv.getInterpolant(cconj2, gg)
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.getInterpolant(conj2)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.getInterpolant(conj2, gg)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.getInterpolant(cconj2, g)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2022-05-17 06:40:32 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_interpolant_next(tm, solver):
|
2022-01-04 17:18:41 +02:00
|
|
|
solver.setLogic("QF_LIA")
|
2022-03-28 15:30:19 -07:00
|
|
|
solver.setOption("produce-interpolants", "true")
|
2022-01-04 17:18:41 +02:00
|
|
|
solver.setOption("incremental", "true")
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
x = tm.mkConst(intSort, "x")
|
|
|
|
|
y = tm.mkConst(intSort, "y")
|
|
|
|
|
z = tm.mkConst(intSort, "z")
|
2022-01-04 17:18:41 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.assertFormula(tm.mkTerm(
|
|
|
|
|
Kind.GT, tm.mkTerm(Kind.ADD, x, y), zero))
|
|
|
|
|
solver.assertFormula(tm.mkTerm(Kind.LT, x, zero))
|
|
|
|
|
conj = tm.mkTerm(
|
2022-04-01 12:45:36 -07:00
|
|
|
Kind.OR,
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(Kind.GT, tm.mkTerm(Kind.ADD, y, z), zero),
|
|
|
|
|
tm.mkTerm(Kind.LT, z, zero))
|
2022-03-11 15:41:54 -06:00
|
|
|
output = solver.getInterpolant(conj)
|
|
|
|
|
output2 = solver.getInterpolantNext()
|
2022-01-04 17:18:41 +02:00
|
|
|
|
|
|
|
|
assert output != output2
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_declare_pool(tm, solver):
|
|
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
setSort = tm.mkSetSort(intSort)
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
x = tm.mkConst(intSort, "x")
|
|
|
|
|
y = tm.mkConst(intSort, "y")
|
2021-12-01 01:38:44 +02:00
|
|
|
# declare a pool with initial value 0, x, y
|
|
|
|
|
p = solver.declarePool("p", intSort, [zero, x, y])
|
|
|
|
|
# pool should have the same sort
|
|
|
|
|
assert p.getSort() == setSort
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.declarePool(
|
|
|
|
|
"p",
|
|
|
|
|
tm.getIntegerSort(),
|
|
|
|
|
[tm.mkInteger(0), tm.mkConst(intSort, "x"), tm.mkConst(intSort, "y")])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.declarePool(
|
|
|
|
|
"p",
|
|
|
|
|
tm.getIntegerSort(),
|
|
|
|
|
[tm.mkInteger(0), tm.mkConst(intSort, "x"), tm.mkConst(intSort, "y")])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.declarePool(
|
|
|
|
|
"p",
|
|
|
|
|
tm.getIntegerSort(),
|
|
|
|
|
[tm.mkInteger(0), tm.mkConst(intSort, "x"), tm.mkConst(intSort, "y")])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.declarePool(
|
|
|
|
|
"p",
|
|
|
|
|
tm.getIntegerSort(),
|
|
|
|
|
[tm.mkInteger(0), tm.mkConst(intSort, "x"), tm.mkConst(intSort, "y")])
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_model_domain_elements(tm, solver):
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
x = tm.mkConst(uSort, "x")
|
|
|
|
|
y = tm.mkConst(uSort, "y")
|
|
|
|
|
z = tm.mkConst(uSort, "z")
|
|
|
|
|
f = tm.mkTerm(Kind.DISTINCT, x, y, z)
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.assertFormula(f)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
solver.getModelDomainElements(uSort)
|
|
|
|
|
assert len(solver.getModelDomainElements(uSort)) >= 3
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getModelDomainElements(intSort)
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("produce-models", "true")
|
|
|
|
|
slv.checkSat()
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.getModelDomainElements(tm.mkUninterpretedSort("u"))
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_model_domain_elements2(tm, solver):
|
2022-03-30 09:05:49 +03:00
|
|
|
solver.setOption("produce-models", "true")
|
|
|
|
|
solver.setOption("finite-model-find", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
x = tm.mkVar(uSort, "x")
|
|
|
|
|
y = tm.mkVar(uSort, "y")
|
|
|
|
|
eq = tm.mkTerm(Kind.EQUAL, x, y)
|
|
|
|
|
bvl = tm.mkTerm(Kind.VARIABLE_LIST, x, y)
|
|
|
|
|
f = tm.mkTerm(Kind.FORALL, bvl, eq)
|
2022-03-30 09:05:49 +03:00
|
|
|
solver.assertFormula(f)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
solver.getModelDomainElements(uSort)
|
|
|
|
|
assert len(solver.getModelDomainElements(uSort)) == 1
|
|
|
|
|
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_synth_solutions(tm, solver):
|
2022-03-24 21:21:44 -05:00
|
|
|
solver.setOption("sygus", "true")
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkBoolean(False)
|
2021-12-01 01:38:44 +02:00
|
|
|
f = solver.synthFun("f", [], solver.getBooleanSort())
|
|
|
|
|
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getSynthSolutions([])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getSynthSolutions([f])
|
|
|
|
|
|
|
|
|
|
solver.checkSynth()
|
|
|
|
|
|
|
|
|
|
solver.getSynthSolutions([f])
|
|
|
|
|
solver.getSynthSolutions([f, f])
|
|
|
|
|
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getSynthSolutions([])
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getSynthSolutions([x])
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
2021-12-01 01:38:44 +02:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.getSynthSolutions([x])
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value_sep_heap1(tm, solver):
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.setLogic("QF_BV")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkTrue()
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getValueSepHeap()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_value_sep_heap2(solver):
|
|
|
|
|
solver.setLogic("ALL")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "false")
|
|
|
|
|
checkSimpleSeparationConstraints(solver)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getValueSepHeap()
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value_sep_heap3(tm, solver):
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.setLogic("ALL")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkFalse()
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getValueSepHeap()
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value_sep_heap4(tm, solver):
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.setLogic("ALL")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkTrue()
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getValueSepHeap()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_value_sep_heap5(solver):
|
|
|
|
|
solver.setLogic("ALL")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
|
|
|
|
checkSimpleSeparationConstraints(solver)
|
|
|
|
|
solver.getValueSepHeap()
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value_sep_nil1(tm, solver):
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.setLogic("QF_BV")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkTrue()
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getValueSepNil()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_value_sep_nil2(solver):
|
|
|
|
|
solver.setLogic("ALL")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "false")
|
|
|
|
|
checkSimpleSeparationConstraints(solver)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getValueSepNil()
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value_sep_nil3(tm, solver):
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.setLogic("ALL")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkFalse()
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getValueSepNil()
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_value_sep_nil4(tm, solver):
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.setLogic("ALL")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
t = tm.mkTrue()
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.assertFormula(t)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getValueSepNil()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_get_value_sep_nil5(solver):
|
|
|
|
|
solver.setLogic("ALL")
|
|
|
|
|
solver.setOption("incremental", "false")
|
|
|
|
|
solver.setOption("produce-models", "true")
|
|
|
|
|
checkSimpleSeparationConstraints(solver)
|
|
|
|
|
solver.getValueSepNil()
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_is_model_core_symbol(tm, solver):
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.setOption("produce-models", "true")
|
|
|
|
|
solver.setOption("model-cores", "simple")
|
2024-03-14 14:34:58 -07:00
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
x = tm.mkConst(uSort, "x")
|
|
|
|
|
y = tm.mkConst(uSort, "y")
|
|
|
|
|
z = tm.mkConst(uSort, "z")
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
f = tm.mkTerm(Kind.NOT, tm.mkTerm(Kind.EQUAL, x, y))
|
2021-12-01 01:38:44 +02:00
|
|
|
solver.assertFormula(f)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
assert solver.isModelCoreSymbol(x)
|
|
|
|
|
assert solver.isModelCoreSymbol(y)
|
|
|
|
|
assert not solver.isModelCoreSymbol(z)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.isModelCoreSymbol(zero)
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("produce-models", "true")
|
|
|
|
|
slv.checkSat()
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.isModelCoreSymbol(tm.mkConst(uSort, "x"))
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_model(tm, solver):
|
2022-03-11 15:46:38 -08:00
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
x = tm.mkConst(uSort, "x")
|
|
|
|
|
y = tm.mkConst(uSort, "y")
|
|
|
|
|
z = tm.mkConst(uSort, "z")
|
|
|
|
|
f = tm.mkTerm(Kind.NOT, tm.mkTerm(Kind.EQUAL, x, y))
|
2022-03-11 15:46:38 -08:00
|
|
|
solver.assertFormula(f)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
sorts = [uSort]
|
|
|
|
|
terms = [x, y]
|
|
|
|
|
solver.getModel(sorts, terms)
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_model2(tm):
|
2022-03-11 15:46:38 -08:00
|
|
|
solver.setOption("produce-models", "true")
|
|
|
|
|
sorts = []
|
|
|
|
|
terms = []
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getModel(sorts, terms)
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_model3(tm, solver):
|
2022-03-11 15:46:38 -08:00
|
|
|
solver.setOption("produce-models", "true")
|
|
|
|
|
sorts = []
|
|
|
|
|
terms = []
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
solver.getModel(sorts, terms)
|
2024-03-14 14:34:58 -07:00
|
|
|
integer = tm.getIntegerSort()
|
2022-03-11 15:46:38 -08:00
|
|
|
sorts.append(integer)
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getModel(sorts, terms)
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_issue5893(tm):
|
|
|
|
|
bvsort4 = tm.mkBitVectorSort(4)
|
|
|
|
|
bvsort8 = tm.mkBitVectorSort(8)
|
|
|
|
|
arrsort = tm.mkArraySort(bvsort4, bvsort8)
|
|
|
|
|
arr = tm.mkConst(arrsort, "arr")
|
|
|
|
|
idx = tm.mkConst(bvsort4, "idx")
|
|
|
|
|
ten = tm.mkBitVector(8, "10", 10)
|
|
|
|
|
sel = tm.mkTerm(Kind.SELECT, arr, idx)
|
|
|
|
|
distinct = tm.mkTerm(Kind.DISTINCT, sel, ten)
|
2021-12-01 01:38:44 +02:00
|
|
|
distinct.getOp()
|
|
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_issue7000(tm, solver):
|
|
|
|
|
s1 = tm.getIntegerSort()
|
|
|
|
|
s2 = tm.mkFunctionSort(s1, s1)
|
2021-12-01 01:38:44 +02:00
|
|
|
s3 = solver.getRealSort()
|
2024-03-14 14:34:58 -07:00
|
|
|
t4 = tm.mkPi()
|
|
|
|
|
t7 = tm.mkConst(s3, "_x5")
|
|
|
|
|
t37 = tm.mkConst(s2, "_x32")
|
|
|
|
|
t59 = tm.mkConst(s2, "_x51")
|
|
|
|
|
t72 = tm.mkTerm(Kind.EQUAL, t37, t59)
|
|
|
|
|
t74 = tm.mkTerm(Kind.GT, t4, t7)
|
|
|
|
|
query = tm.mkTerm(Kind.AND, t72, t74, t72, t72)
|
2021-12-01 01:38:44 +02:00
|
|
|
# throws logic exception since logic is not higher order by default
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2022-03-14 13:29:30 -05:00
|
|
|
solver.checkSatAssuming(query.notTerm())
|
2021-12-01 01:38:44 +02:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_mk_sygus_var(tm, solver):
|
2022-03-25 06:08:01 -07:00
|
|
|
solver.setOption("sygus", "true")
|
2021-12-01 01:38:44 +02:00
|
|
|
boolSort = solver.getBooleanSort()
|
2024-03-14 14:34:58 -07:00
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
funSort = tm.mkFunctionSort(intSort, boolSort)
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2022-03-31 18:32:44 -07:00
|
|
|
solver.declareSygusVar("", boolSort)
|
|
|
|
|
solver.declareSygusVar("", funSort)
|
|
|
|
|
solver.declareSygusVar("b", boolSort)
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
2021-12-01 01:38:44 +02:00
|
|
|
with pytest.raises(RuntimeError):
|
2022-03-31 18:32:44 -07:00
|
|
|
slv.declareSygusVar("", boolSort)
|
2021-12-01 01:38:44 +02:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_synth_fun(tm, solver):
|
2022-03-24 21:21:44 -05:00
|
|
|
solver.setOption("sygus", "true")
|
2021-12-01 01:38:44 +02:00
|
|
|
boolean = solver.getBooleanSort()
|
2024-03-14 14:34:58 -07:00
|
|
|
integer = tm.getIntegerSort()
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkVar(boolean)
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
start1 = tm.mkVar(boolean)
|
|
|
|
|
start2 = tm.mkVar(integer)
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2022-04-02 14:40:41 -05:00
|
|
|
g1 = solver.mkGrammar(x, [start1])
|
2024-03-14 14:34:58 -07:00
|
|
|
g1.addRule(start1, tm.mkBoolean(False))
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2022-04-02 14:40:41 -05:00
|
|
|
g2 = solver.mkGrammar(x, [start2])
|
2024-03-14 14:34:58 -07:00
|
|
|
g2.addRule(start2, tm.mkInteger(0))
|
2021-12-01 01:38:44 +02:00
|
|
|
|
|
|
|
|
solver.synthFun("", [], boolean)
|
|
|
|
|
solver.synthFun("f1", [x], boolean)
|
|
|
|
|
solver.synthFun("f2", [x], boolean, g1)
|
|
|
|
|
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.synthFun("f6", [x], boolean, g2)
|
2024-03-18 13:20:34 -07:00
|
|
|
slv = Solver(tm)
|
2022-03-25 06:08:01 -07:00
|
|
|
slv.setOption("sygus", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
x2 = tm.mkVar(tm.getBooleanSort())
|
|
|
|
|
slv.synthFun("f1", [x2], tm.getBooleanSort())
|
|
|
|
|
slv.synthFun("", [], tm.getBooleanSort())
|
|
|
|
|
slv.synthFun("f1", [x], tm.getBooleanSort())
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("sygus", "true")
|
|
|
|
|
slv.checkSat()
|
|
|
|
|
x2 = ttm.mkVar(ttm.getBooleanSort())
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.synthFun("f1", [x2], tm.getBooleanSort())
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.synthFun("", [], tm.getBooleanSort())
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.synthFun("f1", [x], ttm.getBooleanSort())
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_tuple_project(tm, solver):
|
2021-12-01 01:38:44 +02:00
|
|
|
elements = [\
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkBoolean(True), \
|
|
|
|
|
tm.mkInteger(3),\
|
|
|
|
|
tm.mkString("C"),\
|
|
|
|
|
tm.mkTerm(Kind.SET_SINGLETON, tm.mkString("Z"))]
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
tuple = tm.mkTuple(elements)
|
2021-12-01 01:38:44 +02:00
|
|
|
|
|
|
|
|
indices1 = []
|
|
|
|
|
indices2 = [0]
|
|
|
|
|
indices3 = [0, 1]
|
|
|
|
|
indices4 = [0, 0, 2, 2, 3, 3, 0]
|
|
|
|
|
indices5 = [4]
|
|
|
|
|
indices6 = [0, 4]
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(tm.mkOp(Kind.TUPLE_PROJECT, *indices1), tuple)
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(tm.mkOp(Kind.TUPLE_PROJECT, *indices2), tuple)
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(tm.mkOp(Kind.TUPLE_PROJECT, *indices3), tuple)
|
2021-12-01 01:38:44 +02:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(tm.mkOp(Kind.TUPLE_PROJECT, *indices4), tuple)
|
2021-12-01 01:38:44 +02:00
|
|
|
|
|
|
|
|
with pytest.raises(RuntimeError):
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(tm.mkOp(Kind.TUPLE_PROJECT, *indices5), tuple)
|
2021-12-01 01:38:44 +02:00
|
|
|
with pytest.raises(RuntimeError):
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(tm.mkOp(Kind.TUPLE_PROJECT, *indices6), tuple)
|
2021-12-01 01:38:44 +02:00
|
|
|
|
|
|
|
|
indices = [0, 3, 2, 0, 1, 2]
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
op = tm.mkOp(Kind.TUPLE_PROJECT, *indices)
|
|
|
|
|
projection = tm.mkTerm(op, tuple)
|
2021-12-01 01:38:44 +02:00
|
|
|
|
|
|
|
|
datatype = tuple.getSort().getDatatype()
|
|
|
|
|
constructor = datatype[0]
|
|
|
|
|
|
|
|
|
|
for i in indices:
|
|
|
|
|
|
2022-04-02 11:57:50 -07:00
|
|
|
selectorTerm = constructor[i].getTerm()
|
2024-03-14 14:34:58 -07:00
|
|
|
selectedTerm = tm.mkTerm(Kind.APPLY_SELECTOR, selectorTerm, tuple)
|
2021-12-01 01:38:44 +02:00
|
|
|
simplifiedTerm = solver.simplify(selectedTerm)
|
|
|
|
|
assert elements[i] == simplifiedTerm
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
assert "((_ tuple.project 0 3 2 0 1 2) "\
|
|
|
|
|
"(tuple true 3 \"C\" (set.singleton \"Z\")))" == \
|
|
|
|
|
str(projection)
|
2022-03-30 09:05:49 +03:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_data_type_arity(tm, solver):
|
|
|
|
|
ctor1 = tm.mkDatatypeConstructorDecl("_x21")
|
|
|
|
|
ctor2 = tm.mkDatatypeConstructorDecl("_x31")
|
2022-04-01 18:58:00 +02:00
|
|
|
s3 = solver.declareDatatype("_x17", ctor1, ctor2)
|
2022-03-30 09:05:49 +03:00
|
|
|
assert s3.getDatatypeArity() == 0
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_unsat_core_lemmas1(tm, solver):
|
2023-09-27 17:24:17 -03:00
|
|
|
solver.setOption("produce-unsat-cores", "true")
|
|
|
|
|
solver.setOption("unsat-cores-mode", "sat-proof")
|
|
|
|
|
# cannot ask before a check sat
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getUnsatCoreLemmas()
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.assertFormula(tm.mkFalse())
|
2023-09-27 17:24:17 -03:00
|
|
|
assert solver.checkSat().isUnsat()
|
|
|
|
|
solver.getUnsatCoreLemmas()
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_unsat_core_lemmas2(tm, solver):
|
2023-09-27 17:24:17 -03:00
|
|
|
solver.setOption("produce-unsat-cores", "true")
|
|
|
|
|
solver.setOption("unsat-cores-mode", "sat-proof")
|
2024-03-14 14:34:58 -07:00
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
intSort = tm.getIntegerSort()
|
2023-09-27 17:24:17 -03:00
|
|
|
boolSort = solver.getBooleanSort()
|
2024-03-14 14:34:58 -07:00
|
|
|
uToIntSort = tm.mkFunctionSort(uSort, intSort)
|
|
|
|
|
intPredSort = tm.mkFunctionSort(intSort, boolSort)
|
2023-09-27 17:24:17 -03:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
x = tm.mkConst(uSort, "x")
|
|
|
|
|
y = tm.mkConst(uSort, "y")
|
|
|
|
|
f = tm.mkConst(uToIntSort, "f")
|
|
|
|
|
p = tm.mkConst(intPredSort, "p")
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
one = tm.mkInteger(1)
|
|
|
|
|
f_x = tm.mkTerm(Kind.APPLY_UF, f, x)
|
|
|
|
|
f_y = tm.mkTerm(Kind.APPLY_UF, f, y)
|
|
|
|
|
summ = tm.mkTerm(Kind.ADD, f_x, f_y)
|
|
|
|
|
p_0 = tm.mkTerm(Kind.APPLY_UF, p, zero)
|
|
|
|
|
p_f_y = tm.mkTerm(Kind.APPLY_UF, p, f_y)
|
|
|
|
|
solver.assertFormula(tm.mkTerm(Kind.GT, zero, f_x))
|
|
|
|
|
solver.assertFormula(tm.mkTerm(Kind.GT, zero, f_y))
|
|
|
|
|
solver.assertFormula(tm.mkTerm(Kind.GT, summ, one))
|
2023-09-27 17:24:17 -03:00
|
|
|
solver.assertFormula(p_0)
|
|
|
|
|
solver.assertFormula(p_f_y.notTerm())
|
|
|
|
|
assert solver.checkSat().isUnsat()
|
|
|
|
|
solver.getUnsatCoreLemmas()
|
2022-03-30 09:05:49 +03:00
|
|
|
|
|
|
|
|
def test_get_difficulty(solver):
|
|
|
|
|
solver.setOption("produce-difficulty", "true")
|
|
|
|
|
# cannot ask before a check sat
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getDifficulty()
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
solver.getDifficulty()
|
|
|
|
|
|
|
|
|
|
def test_get_difficulty2(solver):
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
# option is not set
|
|
|
|
|
solver.getDifficulty()
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_difficulty3(tm, solver):
|
2022-03-30 09:05:49 +03:00
|
|
|
solver.setOption("produce-difficulty", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
intSort = tm.getIntegerSort()
|
|
|
|
|
x = tm.mkConst(intSort, "x")
|
|
|
|
|
zero = tm.mkInteger(0)
|
|
|
|
|
ten = tm.mkInteger(10)
|
|
|
|
|
f0 = tm.mkTerm(Kind.GEQ, x, ten)
|
|
|
|
|
f1 = tm.mkTerm(Kind.GEQ, zero, x)
|
2022-03-30 09:05:49 +03:00
|
|
|
solver.checkSat()
|
|
|
|
|
dmap = solver.getDifficulty()
|
|
|
|
|
# difficulty should map assertions to integer values
|
|
|
|
|
for key, value in dmap.items():
|
|
|
|
|
assert key == f0 or key == f1
|
2023-03-08 15:36:44 -06:00
|
|
|
assert value.getKind() == Kind.CONST_INTEGER
|
2022-03-30 09:05:49 +03:00
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_model(tm, solver):
|
2022-03-30 09:05:49 +03:00
|
|
|
solver.setOption("produce-models", "true")
|
2024-03-14 14:34:58 -07:00
|
|
|
uSort = tm.mkUninterpretedSort("u")
|
|
|
|
|
x = tm.mkConst(uSort, "x")
|
|
|
|
|
y = tm.mkConst(uSort, "y")
|
|
|
|
|
z = tm.mkConst(uSort, "z")
|
|
|
|
|
f = tm.mkTerm(Kind.NOT, tm.mkTerm(Kind.EQUAL, x, y));
|
2022-03-30 09:05:49 +03:00
|
|
|
solver.assertFormula(f)
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
sorts = [uSort]
|
|
|
|
|
terms = [x, y]
|
|
|
|
|
solver.getModel(sorts, terms)
|
|
|
|
|
|
|
|
|
|
def test_get_model2(solver):
|
|
|
|
|
solver.setOption("produce-models", "true")
|
|
|
|
|
sorts = []
|
|
|
|
|
terms = []
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getModel(sorts, terms)
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_model_3(tm, solver):
|
2022-03-30 09:05:49 +03:00
|
|
|
solver.setOption("produce-models", "true")
|
|
|
|
|
sorts = []
|
|
|
|
|
terms = []
|
|
|
|
|
solver.checkSat()
|
|
|
|
|
solver.getModel(sorts, terms)
|
2024-03-14 14:34:58 -07:00
|
|
|
integer = tm.getIntegerSort()
|
2022-03-30 09:05:49 +03:00
|
|
|
sorts += [integer]
|
|
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
solver.getModel(sorts, terms)
|
|
|
|
|
|
|
|
|
|
def test_get_option_names(solver):
|
|
|
|
|
names = solver.getOptionNames()
|
|
|
|
|
assert len(names) > 100
|
|
|
|
|
assert "verbose" in names
|
|
|
|
|
assert "foobar" not in names
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_quantifier_elimination(tm, solver):
|
|
|
|
|
x = tm.mkVar(solver.getBooleanSort(), "x")
|
|
|
|
|
forall = tm.mkTerm(
|
2022-04-01 12:45:36 -07:00
|
|
|
Kind.FORALL,
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(Kind.VARIABLE_LIST, x),
|
|
|
|
|
tm.mkTerm(Kind.OR, x, tm.mkTerm(Kind.NOT, x)))
|
2022-03-30 09:05:49 +03:00
|
|
|
with pytest.raises(RuntimeError):
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.getQuantifierElimination(tm.mkBoolean(False))
|
2022-03-30 09:05:49 +03:00
|
|
|
solver.getQuantifierElimination(forall)
|
|
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("produce-models", "true")
|
|
|
|
|
slv.checkSat()
|
|
|
|
|
xx = tm.mkVar(tm.getBooleanSort(), "x")
|
|
|
|
|
fforall = tm.mkTerm(
|
|
|
|
|
Kind.FORALL,
|
|
|
|
|
tm.mkTerm(Kind.VARIABLE_LIST, xx),
|
|
|
|
|
tm.mkTerm(Kind.OR, xx, tm.mkTerm(Kind.NOT, xx)))
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.getQuantifierElimination(fforall)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
|
|
|
|
|
2024-03-14 14:34:58 -07:00
|
|
|
def test_get_quantifier_elimination_disjunct(tm, solver):
|
|
|
|
|
x = tm.mkVar(solver.getBooleanSort(), "x")
|
|
|
|
|
forall = tm.mkTerm(
|
2022-04-01 12:45:36 -07:00
|
|
|
Kind.FORALL,
|
2024-03-14 14:34:58 -07:00
|
|
|
tm.mkTerm(Kind.VARIABLE_LIST, x),
|
|
|
|
|
tm.mkTerm(Kind.OR, x, tm.mkTerm(Kind.NOT, x)))
|
2022-03-30 09:05:49 +03:00
|
|
|
with pytest.raises(RuntimeError):
|
2024-03-14 14:34:58 -07:00
|
|
|
solver.getQuantifierEliminationDisjunct(tm.mkBoolean(False))
|
2022-03-30 09:05:49 +03:00
|
|
|
solver.getQuantifierEliminationDisjunct(forall)
|
2022-08-30 12:04:04 -07:00
|
|
|
|
2024-03-18 13:20:34 -07:00
|
|
|
ttm = TermManager()
|
|
|
|
|
slv = Solver(ttm)
|
|
|
|
|
slv.setOption("produce-models", "true")
|
|
|
|
|
slv.checkSat()
|
|
|
|
|
xx = tm.mkVar(tm.getBooleanSort(), "x")
|
|
|
|
|
fforall = tm.mkTerm(
|
|
|
|
|
Kind.FORALL,
|
|
|
|
|
tm.mkTerm(Kind.VARIABLE_LIST, xx),
|
|
|
|
|
tm.mkTerm(Kind.OR, xx, tm.mkTerm(Kind.NOT, xx)))
|
2025-04-15 18:39:01 -07:00
|
|
|
with pytest.raises(RuntimeError):
|
|
|
|
|
slv.getQuantifierEliminationDisjunct(fforall)
|
2024-03-18 13:20:34 -07:00
|
|
|
|
|
|
|
|
|
2022-08-30 12:04:04 -07:00
|
|
|
def test_get_version(solver):
|
|
|
|
|
print(solver.getVersion())
|
2024-03-14 14:34:58 -07:00
|
|
|
|
2024-06-25 16:52:35 +02:00
|
|
|
class PluginUnsat(Plugin):
|
|
|
|
|
def __init__(self, tm):
|
|
|
|
|
super().__init__(tm)
|
|
|
|
|
self.tm = tm
|
|
|
|
|
|
|
|
|
|
def check(self):
|
|
|
|
|
lemmas = [self.tm.mkBoolean(False)]
|
|
|
|
|
return lemmas
|
|
|
|
|
|
|
|
|
|
def getName(self):
|
|
|
|
|
return "PluginUnsat"
|
|
|
|
|
|
|
|
|
|
def test_plugin_unsat(tm, solver):
|
|
|
|
|
p = PluginUnsat(tm)
|
|
|
|
|
solver.addPlugin(p)
|
|
|
|
|
assert solver.checkSat().isUnsat()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class PluginListen(Plugin):
|
|
|
|
|
def __init__(self, tm):
|
|
|
|
|
super().__init__(tm)
|
|
|
|
|
self.has_seen_theory_lemma = False
|
|
|
|
|
self.has_seen_sat_clause = False
|
|
|
|
|
|
|
|
|
|
def notifySatClause(self, cl):
|
|
|
|
|
super().notifySatClause(cl)
|
|
|
|
|
self.has_seen_sat_clause = True
|
|
|
|
|
|
|
|
|
|
def hasSeenSatClause(self):
|
|
|
|
|
return self.has_seen_sat_clause
|
|
|
|
|
|
|
|
|
|
def notifyTheoryLemma(self, lem):
|
|
|
|
|
super().notifyTheoryLemma(lem)
|
|
|
|
|
self.has_seen_theory_lemma = True
|
|
|
|
|
|
|
|
|
|
def hasSeenTheoryLemma(self):
|
|
|
|
|
return self.has_seen_theory_lemma
|
|
|
|
|
|
|
|
|
|
def getName(self):
|
|
|
|
|
return "PluginListen"
|
|
|
|
|
|
|
|
|
|
def test_plugin_listen(tm, solver):
|
|
|
|
|
# NOTE: this shouldn't be necessary but ensures notifySatClause is called here.
|
|
|
|
|
solver.setOption("plugin-notify-sat-clause-in-solve", "false")
|
|
|
|
|
pl = PluginListen(tm)
|
|
|
|
|
solver.addPlugin(pl)
|
|
|
|
|
stringSort = tm.getStringSort()
|
|
|
|
|
x = tm.mkConst(stringSort, "x")
|
|
|
|
|
y = tm.mkConst(stringSort, "y")
|
|
|
|
|
ctn1 = tm.mkTerm(Kind.STRING_CONTAINS, x, y)
|
|
|
|
|
ctn2 = tm.mkTerm(Kind.STRING_CONTAINS, y, x)
|
|
|
|
|
solver.assertFormula(tm.mkTerm(Kind.OR, ctn1, ctn2))
|
|
|
|
|
lx = tm.mkTerm(Kind.STRING_LENGTH, x)
|
|
|
|
|
ly = tm.mkTerm(Kind.STRING_LENGTH, y)
|
|
|
|
|
lc = tm.mkTerm(Kind.GT, lx, ly)
|
|
|
|
|
solver.assertFormula(lc)
|
|
|
|
|
assert solver.checkSat().isSat()
|
|
|
|
|
# above input formulas should induce a theory lemma and SAT clause learning
|
|
|
|
|
assert pl.hasSeenTheoryLemma()
|
|
|
|
|
assert pl.hasSeenSatClause()
|