mirror of
https://github.com/AdaCore/cvc5.git
synced 2026-02-12 12:32:16 -08:00
1322 lines
40 KiB
Python
1322 lines
40 KiB
Python
###############################################################################
|
|
# Top contributors (to current version):
|
|
# Yoni Zohar, Aina Niemetz, Andres Noetzli
|
|
#
|
|
# This file is part of the cvc5 project.
|
|
#
|
|
# Copyright (c) 2009-2022 by the authors listed in the file AUTHORS
|
|
# 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.
|
|
# #############################################################################
|
|
##
|
|
|
|
import pytest
|
|
import cvc5
|
|
from cvc5 import Kind, RoundingMode
|
|
from cvc5 import Sort, Term
|
|
from fractions import Fraction
|
|
|
|
|
|
@pytest.fixture
|
|
def solver():
|
|
return cvc5.Solver()
|
|
|
|
|
|
def test_eq(solver):
|
|
uSort = solver.mkUninterpretedSort("u")
|
|
x = solver.mkVar(uSort, "x")
|
|
y = solver.mkVar(uSort, "y")
|
|
z = Term(solver)
|
|
|
|
assert x == x
|
|
assert not x != x
|
|
assert not x == y
|
|
assert x != y
|
|
assert not (x == z)
|
|
assert x != z
|
|
|
|
|
|
def test_get_id(solver):
|
|
n = Term(solver)
|
|
with pytest.raises(RuntimeError):
|
|
n.getId()
|
|
x = solver.mkVar(solver.getIntegerSort(), "x")
|
|
x.getId()
|
|
y = x
|
|
assert x.getId() == y.getId()
|
|
|
|
z = solver.mkVar(solver.getIntegerSort(), "z")
|
|
assert x.getId() != z.getId()
|
|
|
|
|
|
def test_get_kind(solver):
|
|
uSort = solver.mkUninterpretedSort("u")
|
|
intSort = solver.getIntegerSort()
|
|
boolSort = solver.getBooleanSort()
|
|
funSort1 = solver.mkFunctionSort(uSort, intSort)
|
|
funSort2 = solver.mkFunctionSort(intSort, boolSort)
|
|
|
|
n = Term(solver)
|
|
with pytest.raises(RuntimeError):
|
|
n.getKind()
|
|
x = solver.mkVar(uSort, "x")
|
|
x.getKind()
|
|
y = solver.mkVar(uSort, "y")
|
|
y.getKind()
|
|
|
|
f = solver.mkVar(funSort1, "f")
|
|
f.getKind()
|
|
p = solver.mkVar(funSort2, "p")
|
|
p.getKind()
|
|
|
|
zero = solver.mkInteger(0)
|
|
zero.getKind()
|
|
|
|
f_x = solver.mkTerm(Kind.APPLY_UF, f, x)
|
|
f_x.getKind()
|
|
f_y = solver.mkTerm(Kind.APPLY_UF, f, y)
|
|
f_y.getKind()
|
|
sum = solver.mkTerm(Kind.ADD, f_x, f_y)
|
|
sum.getKind()
|
|
p_0 = solver.mkTerm(Kind.APPLY_UF, p, zero)
|
|
p_0.getKind()
|
|
p_f_y = solver.mkTerm(Kind.APPLY_UF, p, f_y)
|
|
p_f_y.getKind()
|
|
|
|
# Sequence kinds do not exist internally, test that the API properly
|
|
# converts them back.
|
|
seqSort = solver.mkSequenceSort(intSort)
|
|
s = solver.mkConst(seqSort, "s")
|
|
ss = solver.mkTerm(Kind.SEQ_CONCAT, s, s)
|
|
assert ss.getKind() == Kind.SEQ_CONCAT
|
|
|
|
|
|
def test_get_sort(solver):
|
|
bvSort = solver.mkBitVectorSort(8)
|
|
intSort = solver.getIntegerSort()
|
|
boolSort = solver.getBooleanSort()
|
|
funSort1 = solver.mkFunctionSort(bvSort, intSort)
|
|
funSort2 = solver.mkFunctionSort(intSort, boolSort)
|
|
|
|
n = Term(solver)
|
|
with pytest.raises(RuntimeError):
|
|
n.getSort()
|
|
x = solver.mkVar(bvSort, "x")
|
|
x.getSort()
|
|
assert x.getSort() == bvSort
|
|
y = solver.mkVar(bvSort, "y")
|
|
y.getSort()
|
|
assert y.getSort() == bvSort
|
|
|
|
f = solver.mkVar(funSort1, "f")
|
|
f.getSort()
|
|
assert f.getSort() == funSort1
|
|
p = solver.mkVar(funSort2, "p")
|
|
p.getSort()
|
|
assert p.getSort() == funSort2
|
|
|
|
zero = solver.mkInteger(0)
|
|
zero.getSort()
|
|
assert zero.getSort() == intSort
|
|
|
|
f_x = solver.mkTerm(Kind.APPLY_UF, f, x)
|
|
f_x.getSort()
|
|
assert f_x.getSort() == intSort
|
|
f_y = solver.mkTerm(Kind.APPLY_UF, f, y)
|
|
f_y.getSort()
|
|
assert f_y.getSort() == intSort
|
|
sum = solver.mkTerm(Kind.ADD, f_x, f_y)
|
|
sum.getSort()
|
|
assert sum.getSort() == intSort
|
|
p_0 = solver.mkTerm(Kind.APPLY_UF, p, zero)
|
|
p_0.getSort()
|
|
assert p_0.getSort() == boolSort
|
|
p_f_y = solver.mkTerm(Kind.APPLY_UF, p, f_y)
|
|
p_f_y.getSort()
|
|
assert p_f_y.getSort() == boolSort
|
|
|
|
|
|
def test_get_op(solver):
|
|
intsort = solver.getIntegerSort()
|
|
bvsort = solver.mkBitVectorSort(8)
|
|
arrsort = solver.mkArraySort(bvsort, intsort)
|
|
funsort = solver.mkFunctionSort(intsort, bvsort)
|
|
|
|
x = solver.mkConst(intsort, "x")
|
|
a = solver.mkConst(arrsort, "a")
|
|
b = solver.mkConst(bvsort, "b")
|
|
|
|
assert not x.hasOp()
|
|
with pytest.raises(RuntimeError):
|
|
x.getOp()
|
|
|
|
ab = solver.mkTerm(Kind.SELECT, a, b)
|
|
ext = solver.mkOp(Kind.BITVECTOR_EXTRACT, 4, 0)
|
|
extb = solver.mkTerm(ext, b)
|
|
|
|
assert ab.hasOp()
|
|
assert not ab.getOp().isIndexed()
|
|
# can compare directly to a Kind (will invoke constructor)
|
|
assert extb.hasOp()
|
|
assert extb.getOp().isIndexed()
|
|
assert extb.getOp() == ext
|
|
|
|
f = solver.mkConst(funsort, "f")
|
|
fx = solver.mkTerm(Kind.APPLY_UF, f, x)
|
|
|
|
assert not f.hasOp()
|
|
with pytest.raises(RuntimeError):
|
|
f.getOp()
|
|
assert fx.hasOp()
|
|
children = [c for c in fx]
|
|
# testing rebuild from op and children
|
|
assert fx == solver.mkTerm(fx.getOp(), *children)
|
|
|
|
# Test Datatypes Ops
|
|
sort = solver.mkParamSort("T")
|
|
listDecl = solver.mkDatatypeDecl("paramlist", [sort])
|
|
cons = solver.mkDatatypeConstructorDecl("cons")
|
|
nil = solver.mkDatatypeConstructorDecl("nil")
|
|
cons.addSelector("head", sort)
|
|
cons.addSelectorSelf("tail")
|
|
listDecl.addConstructor(cons)
|
|
listDecl.addConstructor(nil)
|
|
listSort = solver.mkDatatypeSort(listDecl)
|
|
intListSort = listSort.instantiate([solver.getIntegerSort()])
|
|
c = solver.mkConst(intListSort, "c")
|
|
list1 = listSort.getDatatype()
|
|
# list datatype constructor and selector operator terms
|
|
consOpTerm = list1.getConstructor("cons").getTerm()
|
|
nilOpTerm = list1.getConstructor("nil").getTerm()
|
|
headOpTerm = list1["cons"].getSelector("head").getTerm()
|
|
tailOpTerm = list1["cons"].getSelector("tail").getTerm()
|
|
|
|
nilTerm = solver.mkTerm(Kind.APPLY_CONSTRUCTOR, nilOpTerm)
|
|
consTerm = solver.mkTerm(Kind.APPLY_CONSTRUCTOR, consOpTerm,
|
|
solver.mkInteger(0), nilTerm)
|
|
headTerm = solver.mkTerm(Kind.APPLY_SELECTOR, headOpTerm, consTerm)
|
|
tailTerm = solver.mkTerm(Kind.APPLY_SELECTOR, tailOpTerm, consTerm)
|
|
|
|
assert nilTerm.hasOp()
|
|
assert consTerm.hasOp()
|
|
assert headTerm.hasOp()
|
|
assert tailTerm.hasOp()
|
|
|
|
# Test rebuilding
|
|
children = [c for c in headTerm]
|
|
assert headTerm == solver.mkTerm(headTerm.getOp(), *children)
|
|
|
|
|
|
def test_has_get_symbol(solver):
|
|
n = Term(solver)
|
|
t = solver.mkBoolean(True)
|
|
c = solver.mkConst(solver.getBooleanSort(), "|\\|")
|
|
|
|
with pytest.raises(RuntimeError):
|
|
n.hasSymbol()
|
|
assert not t.hasSymbol()
|
|
assert c.hasSymbol()
|
|
|
|
with pytest.raises(RuntimeError):
|
|
n.getSymbol()
|
|
with pytest.raises(RuntimeError):
|
|
t.getSymbol()
|
|
assert c.getSymbol() == "|\\|"
|
|
|
|
|
|
def test_is_null(solver):
|
|
x = Term(solver)
|
|
assert x.isNull()
|
|
x = solver.mkVar(solver.mkBitVectorSort(4), "x")
|
|
assert not x.isNull()
|
|
|
|
|
|
def test_not_term(solver):
|
|
bvSort = solver.mkBitVectorSort(8)
|
|
intSort = solver.getIntegerSort()
|
|
boolSort = solver.getBooleanSort()
|
|
funSort1 = solver.mkFunctionSort(bvSort, intSort)
|
|
funSort2 = solver.mkFunctionSort(intSort, boolSort)
|
|
|
|
with pytest.raises(RuntimeError):
|
|
Term(solver).notTerm()
|
|
b = solver.mkTrue()
|
|
b.notTerm()
|
|
x = solver.mkVar(solver.mkBitVectorSort(8), "x")
|
|
with pytest.raises(RuntimeError):
|
|
x.notTerm()
|
|
f = solver.mkVar(funSort1, "f")
|
|
with pytest.raises(RuntimeError):
|
|
f.notTerm()
|
|
p = solver.mkVar(funSort2, "p")
|
|
with pytest.raises(RuntimeError):
|
|
p.notTerm()
|
|
zero = solver.mkInteger(0)
|
|
with pytest.raises(RuntimeError):
|
|
zero.notTerm()
|
|
f_x = solver.mkTerm(Kind.APPLY_UF, f, x)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.notTerm()
|
|
sum = solver.mkTerm(Kind.ADD, f_x, f_x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.notTerm()
|
|
p_0 = solver.mkTerm(Kind.APPLY_UF, p, zero)
|
|
p_0.notTerm()
|
|
p_f_x = solver.mkTerm(Kind.APPLY_UF, p, f_x)
|
|
p_f_x.notTerm()
|
|
|
|
|
|
def test_and_term(solver):
|
|
bvSort = solver.mkBitVectorSort(8)
|
|
intSort = solver.getIntegerSort()
|
|
boolSort = solver.getBooleanSort()
|
|
funSort1 = solver.mkFunctionSort(bvSort, intSort)
|
|
funSort2 = solver.mkFunctionSort(intSort, boolSort)
|
|
|
|
b = solver.mkTrue()
|
|
with pytest.raises(RuntimeError):
|
|
Term(solver).andTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
b.andTerm(Term(solver))
|
|
b.andTerm(b)
|
|
x = solver.mkVar(solver.mkBitVectorSort(8), "x")
|
|
with pytest.raises(RuntimeError):
|
|
x.andTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
x.andTerm(x)
|
|
f = solver.mkVar(funSort1, "f")
|
|
with pytest.raises(RuntimeError):
|
|
f.andTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
f.andTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
f.andTerm(f)
|
|
p = solver.mkVar(funSort2, "p")
|
|
with pytest.raises(RuntimeError):
|
|
p.andTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p.andTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p.andTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p.andTerm(p)
|
|
zero = solver.mkInteger(0)
|
|
with pytest.raises(RuntimeError):
|
|
zero.andTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
zero.andTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
zero.andTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
zero.andTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
zero.andTerm(zero)
|
|
f_x = solver.mkTerm(Kind.APPLY_UF, f, x)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.andTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.andTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.andTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.andTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.andTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.andTerm(f_x)
|
|
sum = solver.mkTerm(Kind.ADD, f_x, f_x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.andTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
sum.andTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.andTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
sum.andTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
sum.andTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
sum.andTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.andTerm(sum)
|
|
p_0 = solver.mkTerm(Kind.APPLY_UF, p, zero)
|
|
p_0.andTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.andTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.andTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.andTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.andTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.andTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.andTerm(sum)
|
|
p_0.andTerm(p_0)
|
|
p_f_x = solver.mkTerm(Kind.APPLY_UF, p, f_x)
|
|
p_f_x.andTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.andTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.andTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.andTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.andTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.andTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.andTerm(sum)
|
|
p_f_x.andTerm(p_0)
|
|
p_f_x.andTerm(p_f_x)
|
|
|
|
|
|
def test_or_term(solver):
|
|
bvSort = solver.mkBitVectorSort(8)
|
|
intSort = solver.getIntegerSort()
|
|
boolSort = solver.getBooleanSort()
|
|
funSort1 = solver.mkFunctionSort(bvSort, intSort)
|
|
funSort2 = solver.mkFunctionSort(intSort, boolSort)
|
|
|
|
b = solver.mkTrue()
|
|
with pytest.raises(RuntimeError):
|
|
Term(solver).orTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
b.orTerm(Term(solver))
|
|
b.orTerm(b)
|
|
x = solver.mkVar(solver.mkBitVectorSort(8), "x")
|
|
with pytest.raises(RuntimeError):
|
|
x.orTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
x.orTerm(x)
|
|
f = solver.mkVar(funSort1, "f")
|
|
with pytest.raises(RuntimeError):
|
|
f.orTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
f.orTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
f.orTerm(f)
|
|
p = solver.mkVar(funSort2, "p")
|
|
with pytest.raises(RuntimeError):
|
|
p.orTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p.orTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p.orTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p.orTerm(p)
|
|
zero = solver.mkInteger(0)
|
|
with pytest.raises(RuntimeError):
|
|
zero.orTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
zero.orTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
zero.orTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
zero.orTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
zero.orTerm(zero)
|
|
f_x = solver.mkTerm(Kind.APPLY_UF, f, x)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.orTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.orTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.orTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.orTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.orTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.orTerm(f_x)
|
|
sum = solver.mkTerm(Kind.ADD, f_x, f_x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.orTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
sum.orTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.orTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
sum.orTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
sum.orTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
sum.orTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.orTerm(sum)
|
|
p_0 = solver.mkTerm(Kind.APPLY_UF, p, zero)
|
|
p_0.orTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.orTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.orTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.orTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.orTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.orTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.orTerm(sum)
|
|
p_0.orTerm(p_0)
|
|
p_f_x = solver.mkTerm(Kind.APPLY_UF, p, f_x)
|
|
p_f_x.orTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.orTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.orTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.orTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.orTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.orTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.orTerm(sum)
|
|
p_f_x.orTerm(p_0)
|
|
p_f_x.orTerm(p_f_x)
|
|
|
|
|
|
def test_xor_term(solver):
|
|
bvSort = solver.mkBitVectorSort(8)
|
|
intSort = solver.getIntegerSort()
|
|
boolSort = solver.getBooleanSort()
|
|
funSort1 = solver.mkFunctionSort(bvSort, intSort)
|
|
funSort2 = solver.mkFunctionSort(intSort, boolSort)
|
|
|
|
b = solver.mkTrue()
|
|
with pytest.raises(RuntimeError):
|
|
Term(solver).xorTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
b.xorTerm(Term(solver))
|
|
b.xorTerm(b)
|
|
x = solver.mkVar(solver.mkBitVectorSort(8), "x")
|
|
with pytest.raises(RuntimeError):
|
|
x.xorTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
x.xorTerm(x)
|
|
f = solver.mkVar(funSort1, "f")
|
|
with pytest.raises(RuntimeError):
|
|
f.xorTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
f.xorTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
f.xorTerm(f)
|
|
p = solver.mkVar(funSort2, "p")
|
|
with pytest.raises(RuntimeError):
|
|
p.xorTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p.xorTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p.xorTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p.xorTerm(p)
|
|
zero = solver.mkInteger(0)
|
|
with pytest.raises(RuntimeError):
|
|
zero.xorTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
zero.xorTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
zero.xorTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
zero.xorTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
zero.xorTerm(zero)
|
|
f_x = solver.mkTerm(Kind.APPLY_UF, f, x)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.xorTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.xorTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.xorTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.xorTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.xorTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.xorTerm(f_x)
|
|
sum = solver.mkTerm(Kind.ADD, f_x, f_x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.xorTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
sum.xorTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.xorTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
sum.xorTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
sum.xorTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
sum.xorTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.xorTerm(sum)
|
|
p_0 = solver.mkTerm(Kind.APPLY_UF, p, zero)
|
|
p_0.xorTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.xorTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.xorTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.xorTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.xorTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.xorTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.xorTerm(sum)
|
|
p_0.xorTerm(p_0)
|
|
p_f_x = solver.mkTerm(Kind.APPLY_UF, p, f_x)
|
|
p_f_x.xorTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.xorTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.xorTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.xorTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.xorTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.xorTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.xorTerm(sum)
|
|
p_f_x.xorTerm(p_0)
|
|
p_f_x.xorTerm(p_f_x)
|
|
|
|
|
|
def test_eq_term(solver):
|
|
bvSort = solver.mkBitVectorSort(8)
|
|
intSort = solver.getIntegerSort()
|
|
boolSort = solver.getBooleanSort()
|
|
funSort1 = solver.mkFunctionSort(bvSort, intSort)
|
|
funSort2 = solver.mkFunctionSort(intSort, boolSort)
|
|
|
|
b = solver.mkTrue()
|
|
with pytest.raises(RuntimeError):
|
|
Term(solver).eqTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
b.eqTerm(Term(solver))
|
|
b.eqTerm(b)
|
|
x = solver.mkVar(solver.mkBitVectorSort(8), "x")
|
|
with pytest.raises(RuntimeError):
|
|
x.eqTerm(b)
|
|
x.eqTerm(x)
|
|
f = solver.mkVar(funSort1, "f")
|
|
with pytest.raises(RuntimeError):
|
|
f.eqTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
f.eqTerm(x)
|
|
f.eqTerm(f)
|
|
p = solver.mkVar(funSort2, "p")
|
|
with pytest.raises(RuntimeError):
|
|
p.eqTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p.eqTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p.eqTerm(f)
|
|
p.eqTerm(p)
|
|
zero = solver.mkInteger(0)
|
|
with pytest.raises(RuntimeError):
|
|
zero.eqTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
zero.eqTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
zero.eqTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
zero.eqTerm(p)
|
|
zero.eqTerm(zero)
|
|
f_x = solver.mkTerm(Kind.APPLY_UF, f, x)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.eqTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.eqTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.eqTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.eqTerm(p)
|
|
f_x.eqTerm(zero)
|
|
f_x.eqTerm(f_x)
|
|
sum = solver.mkTerm(Kind.ADD, f_x, f_x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.eqTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
sum.eqTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.eqTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
sum.eqTerm(p)
|
|
sum.eqTerm(zero)
|
|
sum.eqTerm(f_x)
|
|
sum.eqTerm(sum)
|
|
p_0 = solver.mkTerm(Kind.APPLY_UF, p, zero)
|
|
p_0.eqTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.eqTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.eqTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.eqTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.eqTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.eqTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.eqTerm(sum)
|
|
p_0.eqTerm(p_0)
|
|
p_f_x = solver.mkTerm(Kind.APPLY_UF, p, f_x)
|
|
p_f_x.eqTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.eqTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.eqTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.eqTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.eqTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.eqTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.eqTerm(sum)
|
|
p_f_x.eqTerm(p_0)
|
|
p_f_x.eqTerm(p_f_x)
|
|
|
|
|
|
def test_imp_term(solver):
|
|
bvSort = solver.mkBitVectorSort(8)
|
|
intSort = solver.getIntegerSort()
|
|
boolSort = solver.getBooleanSort()
|
|
funSort1 = solver.mkFunctionSort(bvSort, intSort)
|
|
funSort2 = solver.mkFunctionSort(intSort, boolSort)
|
|
|
|
b = solver.mkTrue()
|
|
with pytest.raises(RuntimeError):
|
|
Term(solver).impTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
b.impTerm(Term(solver))
|
|
b.impTerm(b)
|
|
x = solver.mkVar(solver.mkBitVectorSort(8), "x")
|
|
with pytest.raises(RuntimeError):
|
|
x.impTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
x.impTerm(x)
|
|
f = solver.mkVar(funSort1, "f")
|
|
with pytest.raises(RuntimeError):
|
|
f.impTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
f.impTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
f.impTerm(f)
|
|
p = solver.mkVar(funSort2, "p")
|
|
with pytest.raises(RuntimeError):
|
|
p.impTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p.impTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p.impTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p.impTerm(p)
|
|
zero = solver.mkInteger(0)
|
|
with pytest.raises(RuntimeError):
|
|
zero.impTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
zero.impTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
zero.impTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
zero.impTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
zero.impTerm(zero)
|
|
f_x = solver.mkTerm(Kind.APPLY_UF, f, x)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.impTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.impTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.impTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.impTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.impTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.impTerm(f_x)
|
|
sum = solver.mkTerm(Kind.ADD, f_x, f_x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.impTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
sum.impTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.impTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
sum.impTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
sum.impTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
sum.impTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.impTerm(sum)
|
|
p_0 = solver.mkTerm(Kind.APPLY_UF, p, zero)
|
|
p_0.impTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.impTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.impTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.impTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.impTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.impTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.impTerm(sum)
|
|
p_0.impTerm(p_0)
|
|
p_f_x = solver.mkTerm(Kind.APPLY_UF, p, f_x)
|
|
p_f_x.impTerm(b)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.impTerm(x)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.impTerm(f)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.impTerm(p)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.impTerm(zero)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.impTerm(f_x)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.impTerm(sum)
|
|
p_f_x.impTerm(p_0)
|
|
p_f_x.impTerm(p_f_x)
|
|
|
|
|
|
def test_ite_term(solver):
|
|
bvSort = solver.mkBitVectorSort(8)
|
|
intSort = solver.getIntegerSort()
|
|
boolSort = solver.getBooleanSort()
|
|
funSort1 = solver.mkFunctionSort(bvSort, intSort)
|
|
funSort2 = solver.mkFunctionSort(intSort, boolSort)
|
|
|
|
b = solver.mkTrue()
|
|
with pytest.raises(RuntimeError):
|
|
Term(solver).iteTerm(b, b)
|
|
with pytest.raises(RuntimeError):
|
|
b.iteTerm(Term(solver), b)
|
|
with pytest.raises(RuntimeError):
|
|
b.iteTerm(b, Term(solver))
|
|
b.iteTerm(b, b)
|
|
x = solver.mkVar(solver.mkBitVectorSort(8), "x")
|
|
b.iteTerm(x, x)
|
|
b.iteTerm(b, b)
|
|
with pytest.raises(RuntimeError):
|
|
b.iteTerm(x, b)
|
|
with pytest.raises(RuntimeError):
|
|
x.iteTerm(x, x)
|
|
with pytest.raises(RuntimeError):
|
|
x.iteTerm(x, b)
|
|
f = solver.mkVar(funSort1, "f")
|
|
with pytest.raises(RuntimeError):
|
|
f.iteTerm(b, b)
|
|
with pytest.raises(RuntimeError):
|
|
x.iteTerm(b, x)
|
|
p = solver.mkVar(funSort2, "p")
|
|
with pytest.raises(RuntimeError):
|
|
p.iteTerm(b, b)
|
|
with pytest.raises(RuntimeError):
|
|
p.iteTerm(x, b)
|
|
zero = solver.mkInteger(0)
|
|
with pytest.raises(RuntimeError):
|
|
zero.iteTerm(x, x)
|
|
with pytest.raises(RuntimeError):
|
|
zero.iteTerm(x, b)
|
|
f_x = solver.mkTerm(Kind.APPLY_UF, f, x)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.iteTerm(b, b)
|
|
with pytest.raises(RuntimeError):
|
|
f_x.iteTerm(b, x)
|
|
sum = solver.mkTerm(Kind.ADD, f_x, f_x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.iteTerm(x, x)
|
|
with pytest.raises(RuntimeError):
|
|
sum.iteTerm(b, x)
|
|
p_0 = solver.mkTerm(Kind.APPLY_UF, p, zero)
|
|
p_0.iteTerm(b, b)
|
|
p_0.iteTerm(x, x)
|
|
with pytest.raises(RuntimeError):
|
|
p_0.iteTerm(x, b)
|
|
p_f_x = solver.mkTerm(Kind.APPLY_UF, p, f_x)
|
|
p_f_x.iteTerm(b, b)
|
|
p_f_x.iteTerm(x, x)
|
|
with pytest.raises(RuntimeError):
|
|
p_f_x.iteTerm(x, b)
|
|
|
|
|
|
def test_term_assignment(solver):
|
|
t1 = solver.mkInteger(1)
|
|
t2 = t1
|
|
t2 = solver.mkInteger(2)
|
|
assert t1 == solver.mkInteger(1)
|
|
|
|
|
|
def test_substitute(solver):
|
|
x = solver.mkConst(solver.getIntegerSort(), "x")
|
|
one = solver.mkInteger(1)
|
|
ttrue = solver.mkTrue()
|
|
xpx = solver.mkTerm(Kind.ADD, x, x)
|
|
onepone = solver.mkTerm(Kind.ADD, one, one)
|
|
|
|
assert xpx.substitute(x, one) == onepone
|
|
assert onepone.substitute(one, x) == xpx
|
|
# incorrect due to type
|
|
with pytest.raises(RuntimeError):
|
|
xpx.substitute(one, ttrue)
|
|
|
|
# simultaneous substitution
|
|
y = solver.mkConst(solver.getIntegerSort(), "y")
|
|
xpy = solver.mkTerm(Kind.ADD, x, y)
|
|
xpone = solver.mkTerm(Kind.ADD, y, one)
|
|
es = []
|
|
rs = []
|
|
es.append(x)
|
|
rs.append(y)
|
|
es.append(y)
|
|
rs.append(one)
|
|
assert xpy.substitute(es, rs) == xpone
|
|
|
|
# incorrect substitution due to arity
|
|
rs.pop()
|
|
with pytest.raises(RuntimeError):
|
|
xpy.substitute(es, rs)
|
|
|
|
# incorrect substitution due to types
|
|
rs.append(ttrue)
|
|
with pytest.raises(RuntimeError):
|
|
xpy.substitute(es, rs)
|
|
|
|
# null cannot substitute
|
|
tnull = Term(solver)
|
|
with pytest.raises(RuntimeError):
|
|
tnull.substitute(one, x)
|
|
with pytest.raises(RuntimeError):
|
|
xpx.substitute(tnull, x)
|
|
with pytest.raises(RuntimeError):
|
|
xpx.substitute(x, tnull)
|
|
rs.pop()
|
|
rs.append(tnull)
|
|
with pytest.raises(RuntimeError):
|
|
xpy.substitute(es, rs)
|
|
es.clear()
|
|
rs.clear()
|
|
es.append(x)
|
|
rs.append(y)
|
|
with pytest.raises(RuntimeError):
|
|
tnull.substitute(es, rs)
|
|
es.append(tnull)
|
|
rs.append(one)
|
|
with pytest.raises(RuntimeError):
|
|
xpx.substitute(es, rs)
|
|
|
|
|
|
def test_term_compare(solver):
|
|
t1 = solver.mkInteger(1)
|
|
t2 = solver.mkTerm(Kind.ADD, solver.mkInteger(2), solver.mkInteger(2))
|
|
t3 = solver.mkTerm(Kind.ADD, solver.mkInteger(2), solver.mkInteger(2))
|
|
assert t2 >= t3
|
|
assert t2 <= t3
|
|
assert (t1 > t2) != (t1 < t2)
|
|
assert (t1 > t2 or t1 == t2) == (t1 >= t2)
|
|
|
|
|
|
def test_term_children(solver):
|
|
# simple term 2+3
|
|
two = solver.mkInteger(2)
|
|
t1 = solver.mkTerm(Kind.ADD, two, solver.mkInteger(3))
|
|
assert t1[0] == two
|
|
assert t1.getNumChildren() == 2
|
|
tnull = Term(solver)
|
|
with pytest.raises(RuntimeError):
|
|
tnull.getNumChildren()
|
|
|
|
# apply term f(2)
|
|
intSort = solver.getIntegerSort()
|
|
fsort = solver.mkFunctionSort(intSort, intSort)
|
|
f = solver.mkConst(fsort, "f")
|
|
t2 = solver.mkTerm(Kind.APPLY_UF, f, two)
|
|
# due to our higher-order view of terms, we treat f as a child of
|
|
# Kind.APPLY_UF
|
|
assert t2.getNumChildren() == 2
|
|
assert t2[0] == f
|
|
assert t2[1] == two
|
|
with pytest.raises(RuntimeError):
|
|
tnull[0]
|
|
|
|
|
|
def test_get_const_array_base(solver):
|
|
intsort = solver.getIntegerSort()
|
|
arrsort = solver.mkArraySort(intsort, intsort)
|
|
one = solver.mkInteger(1)
|
|
constarr = solver.mkConstArray(arrsort, one)
|
|
|
|
assert constarr.isConstArray()
|
|
assert one == constarr.getConstArrayBase()
|
|
|
|
|
|
def test_get_uninterpreted_sort_value(solver):
|
|
solver.setOption("produce-models", "true")
|
|
uSort = solver.mkUninterpretedSort("u")
|
|
x = solver.mkConst(uSort, "x")
|
|
y = solver.mkConst(uSort, "y")
|
|
solver.assertFormula(solver.mkTerm(Kind.EQUAL, x, y))
|
|
assert solver.checkSat().isSat()
|
|
vx = solver.getValue(x)
|
|
vy = solver.getValue(y)
|
|
assert vx.isUninterpretedSortValue()
|
|
assert vy.isUninterpretedSortValue()
|
|
assert vx.getUninterpretedSortValue() == vy.getUninterpretedSortValue()
|
|
|
|
|
|
def test_is_rounding_mode_value(solver):
|
|
assert not solver.mkInteger(15).isRoundingModeValue()
|
|
assert solver.mkRoundingMode(
|
|
RoundingMode.ROUND_NEAREST_TIES_TO_EVEN).isRoundingModeValue()
|
|
assert not solver.mkConst(
|
|
solver.getRoundingModeSort()).isRoundingModeValue()
|
|
|
|
|
|
def test_get_rounding_mode_value(solver):
|
|
with pytest.raises(RuntimeError):
|
|
solver.mkInteger(15).getRoundingModeValue()
|
|
assert solver.mkRoundingMode(
|
|
RoundingMode.ROUND_NEAREST_TIES_TO_EVEN).getRoundingModeValue(
|
|
) == RoundingMode.ROUND_NEAREST_TIES_TO_EVEN
|
|
assert solver.mkRoundingMode(
|
|
RoundingMode.ROUND_TOWARD_POSITIVE).getRoundingModeValue(
|
|
) == RoundingMode.ROUND_TOWARD_POSITIVE
|
|
assert solver.mkRoundingMode(
|
|
RoundingMode.ROUND_TOWARD_NEGATIVE).getRoundingModeValue(
|
|
) == RoundingMode.ROUND_TOWARD_NEGATIVE
|
|
assert solver.mkRoundingMode(
|
|
RoundingMode.ROUND_TOWARD_ZERO).getRoundingModeValue(
|
|
) == RoundingMode.ROUND_TOWARD_ZERO
|
|
assert solver.mkRoundingMode(
|
|
RoundingMode.ROUND_NEAREST_TIES_TO_AWAY).getRoundingModeValue(
|
|
) == RoundingMode.ROUND_NEAREST_TIES_TO_AWAY
|
|
|
|
|
|
def test_get_tuple(solver):
|
|
s1 = solver.getIntegerSort()
|
|
s2 = solver.getRealSort()
|
|
s3 = solver.getStringSort()
|
|
|
|
t1 = solver.mkInteger(15)
|
|
t2 = solver.mkReal(17, 25)
|
|
t3 = solver.mkString("abc")
|
|
|
|
tup = solver.mkTuple([s1, s2, s3], [t1, t2, t3])
|
|
|
|
assert tup.isTupleValue()
|
|
assert [t1, t2, t3] == tup.getTupleValue()
|
|
|
|
|
|
def test_get_set(solver):
|
|
s = solver.mkSetSort(solver.getIntegerSort())
|
|
|
|
i1 = solver.mkInteger(5)
|
|
i2 = solver.mkInteger(7)
|
|
|
|
s1 = solver.mkEmptySet(s)
|
|
s2 = solver.mkTerm(Kind.SET_SINGLETON, i1)
|
|
s3 = solver.mkTerm(Kind.SET_SINGLETON, i1)
|
|
s4 = solver.mkTerm(Kind.SET_SINGLETON, i2)
|
|
s5 = solver.mkTerm(
|
|
Kind.SET_UNION, s2, solver.mkTerm(Kind.SET_UNION, s3, s4))
|
|
|
|
assert s1.isSetValue()
|
|
assert s2.isSetValue()
|
|
assert s3.isSetValue()
|
|
assert s4.isSetValue()
|
|
assert not s5.isSetValue()
|
|
s5 = solver.simplify(s5)
|
|
assert s5.isSetValue()
|
|
|
|
assert set([]) == s1.getSetValue()
|
|
assert set([i1]) == s2.getSetValue()
|
|
assert set([i1]) == s3.getSetValue()
|
|
assert set([i2]) == s4.getSetValue()
|
|
assert set([i1, i2]) == s5.getSetValue()
|
|
|
|
|
|
def test_get_sequence(solver):
|
|
s = solver.mkSequenceSort(solver.getIntegerSort())
|
|
|
|
i1 = solver.mkInteger(5)
|
|
i2 = solver.mkInteger(7)
|
|
|
|
s1 = solver.mkEmptySequence(s)
|
|
s2 = solver.mkTerm(Kind.SEQ_UNIT, i1)
|
|
s3 = solver.mkTerm(Kind.SEQ_UNIT, i1)
|
|
s4 = solver.mkTerm(Kind.SEQ_UNIT, i2)
|
|
s5 = solver.mkTerm(Kind.SEQ_CONCAT, s2,
|
|
solver.mkTerm(Kind.SEQ_CONCAT, s3, s4))
|
|
|
|
assert s1.isSequenceValue()
|
|
assert not s2.isSequenceValue()
|
|
assert not s3.isSequenceValue()
|
|
assert not s4.isSequenceValue()
|
|
assert not s5.isSequenceValue()
|
|
|
|
s2 = solver.simplify(s2)
|
|
s3 = solver.simplify(s3)
|
|
s4 = solver.simplify(s4)
|
|
s5 = solver.simplify(s5)
|
|
|
|
assert [] == s1.getSequenceValue()
|
|
assert [i1] == s2.getSequenceValue()
|
|
assert [i1] == s3.getSequenceValue()
|
|
assert [i2] == s4.getSequenceValue()
|
|
assert [i1, i1, i2] == s5.getSequenceValue()
|
|
|
|
|
|
def test_get_floating_point(solver):
|
|
bvval = solver.mkBitVector(16, "0000110000000011", 2)
|
|
fp = solver.mkFloatingPoint(5, 11, bvval)
|
|
|
|
assert fp.isFloatingPointValue()
|
|
assert not fp.isFloatingPointPosZero()
|
|
assert not fp.isFloatingPointNegZero()
|
|
assert not fp.isFloatingPointPosInf()
|
|
assert not fp.isFloatingPointNegInf()
|
|
assert not fp.isFloatingPointNaN()
|
|
assert (5, 11, bvval) == fp.getFloatingPointValue()
|
|
|
|
assert solver.mkFloatingPointPosZero(5, 11).isFloatingPointPosZero()
|
|
assert solver.mkFloatingPointNegZero(5, 11).isFloatingPointNegZero()
|
|
assert solver.mkFloatingPointPosInf(5, 11).isFloatingPointPosInf()
|
|
assert solver.mkFloatingPointNegInf(5, 11).isFloatingPointNegInf()
|
|
assert solver.mkFloatingPointNaN(5, 11).isFloatingPointNaN()
|
|
|
|
|
|
def test_is_integer(solver):
|
|
int1 = solver.mkInteger("-18446744073709551616")
|
|
int2 = solver.mkInteger("-18446744073709551615")
|
|
int3 = solver.mkInteger("-4294967296")
|
|
int4 = solver.mkInteger("-4294967295")
|
|
int5 = solver.mkInteger("-10")
|
|
int6 = solver.mkInteger("0")
|
|
int7 = solver.mkInteger("10")
|
|
int8 = solver.mkInteger("4294967295")
|
|
int9 = solver.mkInteger("4294967296")
|
|
int10 = solver.mkInteger("18446744073709551615")
|
|
int11 = solver.mkInteger("18446744073709551616")
|
|
int12 = solver.mkInteger("-0")
|
|
|
|
with pytest.raises(RuntimeError):
|
|
solver.mkInteger("")
|
|
with pytest.raises(RuntimeError):
|
|
solver.mkInteger("-")
|
|
with pytest.raises(RuntimeError):
|
|
solver.mkInteger("-1-")
|
|
with pytest.raises(RuntimeError):
|
|
solver.mkInteger("0.0")
|
|
with pytest.raises(RuntimeError):
|
|
solver.mkInteger("-0.1")
|
|
with pytest.raises(RuntimeError):
|
|
solver.mkInteger("012")
|
|
with pytest.raises(RuntimeError):
|
|
solver.mkInteger("0000")
|
|
with pytest.raises(RuntimeError):
|
|
solver.mkInteger("-01")
|
|
with pytest.raises(RuntimeError):
|
|
solver.mkInteger("-00")
|
|
|
|
assert int1.isIntegerValue()
|
|
assert int2.isIntegerValue()
|
|
assert int3.isIntegerValue()
|
|
assert int4.isIntegerValue()
|
|
assert int5.isIntegerValue()
|
|
assert int6.isIntegerValue()
|
|
assert int7.isIntegerValue()
|
|
assert int8.isIntegerValue()
|
|
assert int9.isIntegerValue()
|
|
assert int10.isIntegerValue()
|
|
assert int11.isIntegerValue()
|
|
|
|
assert int1.getIntegerValue() == -18446744073709551616
|
|
assert int2.getIntegerValue() == -18446744073709551615
|
|
assert int3.getIntegerValue() == -4294967296
|
|
assert int4.getIntegerValue() == -4294967295
|
|
assert int5.getIntegerValue() == -10
|
|
assert int6.getIntegerValue() == 0
|
|
assert int7.getIntegerValue() == 10
|
|
assert int8.getIntegerValue() == 4294967295
|
|
assert int9.getIntegerValue() == 4294967296
|
|
assert int10.getIntegerValue() == 18446744073709551615
|
|
assert int11.getIntegerValue() == 18446744073709551616
|
|
|
|
assert int1.getRealOrIntegerValueSign() == -1
|
|
assert int6.getRealOrIntegerValueSign() == 0
|
|
assert int7.getRealOrIntegerValueSign() == 1
|
|
|
|
|
|
def test_get_string(solver):
|
|
s1 = solver.mkString("abcde")
|
|
assert s1.isStringValue()
|
|
assert s1.getStringValue() == str("abcde")
|
|
|
|
|
|
def test_get_real(solver):
|
|
real1 = solver.mkReal("0")
|
|
real2 = solver.mkReal(".0")
|
|
real3 = solver.mkReal("-17")
|
|
real4 = solver.mkReal("-3/5")
|
|
real5 = solver.mkReal("12.7")
|
|
real6 = solver.mkReal("1/4294967297")
|
|
real7 = solver.mkReal("4294967297")
|
|
real8 = solver.mkReal("1/18446744073709551617")
|
|
real9 = solver.mkReal("18446744073709551617")
|
|
|
|
assert real1.isRealValue()
|
|
assert real2.isRealValue()
|
|
assert real3.isRealValue()
|
|
assert real4.isRealValue()
|
|
assert real5.isRealValue()
|
|
assert real6.isRealValue()
|
|
assert real7.isRealValue()
|
|
assert real8.isRealValue()
|
|
assert real9.isRealValue()
|
|
|
|
assert 0 == real1.getRealValue()
|
|
assert 0 == real2.getRealValue()
|
|
assert -17 == real3.getRealValue()
|
|
assert Fraction(-3, 5) == real4.getRealValue()
|
|
assert Fraction(127, 10) == real5.getRealValue()
|
|
assert Fraction(1, 4294967297) == real6.getRealValue()
|
|
assert 4294967297 == real7.getRealValue()
|
|
assert Fraction(1, 18446744073709551617) == real8.getRealValue()
|
|
assert Fraction(18446744073709551617, 1) == real9.getRealValue()
|
|
|
|
# Check denominator too large for float
|
|
num = 1
|
|
den = 2 ** 64 + 1
|
|
real_big = solver.mkReal(num, den)
|
|
assert real_big.isRealValue()
|
|
assert Fraction(num, den) == real_big.getRealValue()
|
|
|
|
# Check that we're treating floats as decimal aproximations rather than
|
|
# IEEE-754-specified values.
|
|
real_decimal = solver.mkReal(0.3)
|
|
assert real_decimal.isRealValue()
|
|
assert Fraction("0.3") == real_decimal.getRealValue()
|
|
assert Fraction(0.3) == Fraction(5404319552844595, 18014398509481984)
|
|
assert Fraction(0.3) != real_decimal.getRealValue()
|
|
|
|
|
|
def test_get_boolean(solver):
|
|
b1 = solver.mkBoolean(True)
|
|
b2 = solver.mkBoolean(False)
|
|
|
|
assert b1.isBooleanValue()
|
|
assert b2.isBooleanValue()
|
|
assert b1.getBooleanValue()
|
|
assert not b2.getBooleanValue()
|
|
|
|
|
|
def test_get_bit_vector(solver):
|
|
b1 = solver.mkBitVector(8, 15)
|
|
b2 = solver.mkBitVector(8, "00001111", 2)
|
|
b3 = solver.mkBitVector(8, "15", 10)
|
|
b4 = solver.mkBitVector(8, "0f", 16)
|
|
b5 = solver.mkBitVector(9, "00001111", 2);
|
|
b6 = solver.mkBitVector(9, "15", 10);
|
|
b7 = solver.mkBitVector(9, "0f", 16);
|
|
|
|
assert b1.isBitVectorValue()
|
|
assert b2.isBitVectorValue()
|
|
assert b3.isBitVectorValue()
|
|
assert b4.isBitVectorValue()
|
|
assert b5.isBitVectorValue()
|
|
assert b6.isBitVectorValue()
|
|
assert b7.isBitVectorValue()
|
|
|
|
assert "00001111" == b1.getBitVectorValue(2)
|
|
assert "15" == b1.getBitVectorValue(10)
|
|
assert "f" == b1.getBitVectorValue(16)
|
|
assert "00001111" == b2.getBitVectorValue(2)
|
|
assert "15" == b2.getBitVectorValue(10)
|
|
assert "f" == b2.getBitVectorValue(16)
|
|
assert "00001111" == b3.getBitVectorValue(2)
|
|
assert "15" == b3.getBitVectorValue(10)
|
|
assert "f" == b3.getBitVectorValue(16)
|
|
assert "00001111" == b4.getBitVectorValue(2)
|
|
assert "15" == b4.getBitVectorValue(10)
|
|
assert "f" == b4.getBitVectorValue(16)
|
|
assert "000001111" == b5.getBitVectorValue(2)
|
|
assert "15" == b5.getBitVectorValue(10)
|
|
assert "f" == b5.getBitVectorValue(16)
|
|
assert "000001111" == b6.getBitVectorValue(2)
|
|
assert "15" == b6.getBitVectorValue(10)
|
|
assert "f" == b6.getBitVectorValue(16)
|
|
assert "000001111" == b7.getBitVectorValue(2)
|
|
assert "15" == b7.getBitVectorValue(10)
|
|
assert "f" == b7.getBitVectorValue(16)
|
|
|
|
|
|
def test_const_array(solver):
|
|
intsort = solver.getIntegerSort()
|
|
arrsort = solver.mkArraySort(intsort, intsort)
|
|
a = solver.mkConst(arrsort, "a")
|
|
one = solver.mkInteger(1)
|
|
constarr = solver.mkConstArray(arrsort, one)
|
|
|
|
assert constarr.getKind() == Kind.CONST_ARRAY
|
|
assert constarr.getConstArrayBase() == one
|
|
with pytest.raises(RuntimeError):
|
|
a.getConstArrayBase()
|
|
|
|
arrsort = solver.mkArraySort(solver.getRealSort(), solver.getRealSort())
|
|
zero_array = solver.mkConstArray(arrsort, solver.mkReal(0))
|
|
stores = solver.mkTerm(Kind.STORE, zero_array, solver.mkReal(1),
|
|
solver.mkReal(2))
|
|
stores = solver.mkTerm(Kind.STORE, stores, solver.mkReal(2),
|
|
solver.mkReal(3))
|
|
stores = solver.mkTerm(Kind.STORE, stores, solver.mkReal(4),
|
|
solver.mkReal(5))
|
|
|
|
|
|
def test_const_sequence_elements(solver):
|
|
realsort = solver.getRealSort()
|
|
seqsort = solver.mkSequenceSort(realsort)
|
|
s = solver.mkEmptySequence(seqsort)
|
|
|
|
assert s.getKind() == Kind.CONST_SEQUENCE
|
|
# empty sequence has zero elements
|
|
cs = s.getSequenceValue()
|
|
assert len(cs) == 0
|
|
|
|
# A seq.unit app is not a constant sequence (regardless of whether it is
|
|
# applied to a constant).
|
|
su = solver.mkTerm(Kind.SEQ_UNIT, solver.mkReal(1))
|
|
with pytest.raises(RuntimeError):
|
|
su.getSequenceValue()
|
|
|
|
def test_get_cardinality_constraint(solver):
|
|
su = solver.mkUninterpretedSort("u")
|
|
t = solver.mkCardinalityConstraint(su, 3)
|
|
assert t.isCardinalityConstraint()
|
|
cc = t.getCardinalityConstraint()
|
|
assert cc[0] == su
|
|
assert cc[1] == 3
|
|
x = solver.mkConst(solver.getIntegerSort(), "x")
|
|
assert not x.isCardinalityConstraint()
|
|
with pytest.raises(RuntimeError):
|
|
x.getCardinalityConstraint()
|
|
nullt = cvc5.Term(solver)
|
|
with pytest.raises(RuntimeError):
|
|
nullt.isCardinalityConstraint()
|
|
|
|
|
|
def test_term_scoped_to_string(solver):
|
|
intsort = solver.getIntegerSort()
|
|
x = solver.mkConst(intsort, "x")
|
|
assert str(x) == "x"
|
|
solver2 = cvc5.Solver()
|
|
assert str(x) == "x"
|