mirror of
https://github.com/AdaCore/cvc5.git
synced 2026-02-12 12:32:16 -08:00
This is in preparation for getting rid of IllegalArgumentException. This exception was originally used for guards in the old API and is now obsolete.
1336 lines
41 KiB
Python
1336 lines
41 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()
|
|
|
|
with pytest.raises(RuntimeError):
|
|
one.getConstArrayBase()
|
|
|
|
a = solver.mkConst(arrsort, "a")
|
|
with pytest.raises(RuntimeError):
|
|
a.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)
|
|
two = solver.mkBitVector(2, 2)
|
|
iconst = solver.mkConst(intsort)
|
|
constarr = solver.mkConstArray(arrsort, one)
|
|
|
|
with pytest.raises(RuntimeError):
|
|
solver.mkConstArray(arrsort, two)
|
|
with pytest.raises(RuntimeError):
|
|
solver.mkConstArray(arrsort, iconst)
|
|
|
|
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"
|