Files
cvc5/test/unit/api/python/test_term.py

1307 lines
39 KiB
Python
Raw Permalink Normal View History

###############################################################################
# Top contributors (to current version):
2024-03-12 09:35:09 -07:00
# Yoni Zohar, Aina Niemetz, Andrew Reynolds
#
# This file is part of the cvc5 project.
#
# Copyright (c) 2009-2025 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 tm():
return cvc5.TermManager()
@pytest.fixture
def solver(tm):
return cvc5.Solver(tm)
def test_eq(tm):
uSort = tm.mkUninterpretedSort("u")
x = tm.mkVar(uSort, "x")
y = tm.mkVar(uSort, "y")
assert x == x
assert not x != x
assert not x == y
assert x != y
def test_get_id(tm):
x = tm.mkVar(tm.getIntegerSort(), "x")
x.getId()
y = x
assert x.getId() == y.getId()
z = tm.mkVar(tm.getIntegerSort(), "z")
assert x.getId() != z.getId()
def test_get_kind(tm):
uSort = tm.mkUninterpretedSort("u")
intSort = tm.getIntegerSort()
boolSort = tm.getBooleanSort()
funSort1 = tm.mkFunctionSort(uSort, intSort)
funSort2 = tm.mkFunctionSort(intSort, boolSort)
x = tm.mkVar(uSort, "x")
x.getKind()
y = tm.mkVar(uSort, "y")
y.getKind()
f = tm.mkVar(funSort1, "f")
f.getKind()
p = tm.mkVar(funSort2, "p")
p.getKind()
zero = tm.mkInteger(0)
zero.getKind()
f_x = tm.mkTerm(Kind.APPLY_UF, f, x)
f_x.getKind()
f_y = tm.mkTerm(Kind.APPLY_UF, f, y)
f_y.getKind()
sum = tm.mkTerm(Kind.ADD, f_x, f_y)
sum.getKind()
p_0 = tm.mkTerm(Kind.APPLY_UF, p, zero)
p_0.getKind()
p_f_y = tm.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 = tm.mkSequenceSort(intSort)
s = tm.mkConst(seqSort, "s")
ss = tm.mkTerm(Kind.SEQ_CONCAT, s, s)
assert ss.getKind() == Kind.SEQ_CONCAT
def test_get_sort(tm):
bvSort = tm.mkBitVectorSort(8)
intSort = tm.getIntegerSort()
boolSort = tm.getBooleanSort()
funSort1 = tm.mkFunctionSort(bvSort, intSort)
funSort2 = tm.mkFunctionSort(intSort, boolSort)
x = tm.mkVar(bvSort, "x")
x.getSort()
assert x.getSort() == bvSort
y = tm.mkVar(bvSort, "y")
y.getSort()
assert y.getSort() == bvSort
f = tm.mkVar(funSort1, "f")
f.getSort()
assert f.getSort() == funSort1
p = tm.mkVar(funSort2, "p")
p.getSort()
assert p.getSort() == funSort2
zero = tm.mkInteger(0)
zero.getSort()
assert zero.getSort() == intSort
f_x = tm.mkTerm(Kind.APPLY_UF, f, x)
f_x.getSort()
assert f_x.getSort() == intSort
f_y = tm.mkTerm(Kind.APPLY_UF, f, y)
f_y.getSort()
assert f_y.getSort() == intSort
sum = tm.mkTerm(Kind.ADD, f_x, f_y)
sum.getSort()
assert sum.getSort() == intSort
p_0 = tm.mkTerm(Kind.APPLY_UF, p, zero)
p_0.getSort()
assert p_0.getSort() == boolSort
p_f_y = tm.mkTerm(Kind.APPLY_UF, p, f_y)
p_f_y.getSort()
assert p_f_y.getSort() == boolSort
def test_get_op(tm):
intsort = tm.getIntegerSort()
bvsort = tm.mkBitVectorSort(8)
arrsort = tm.mkArraySort(bvsort, intsort)
funsort = tm.mkFunctionSort(intsort, bvsort)
x = tm.mkConst(intsort, "x")
a = tm.mkConst(arrsort, "a")
b = tm.mkConst(bvsort, "b")
assert not x.hasOp()
with pytest.raises(RuntimeError):
x.getOp()
ab = tm.mkTerm(Kind.SELECT, a, b)
ext = tm.mkOp(Kind.BITVECTOR_EXTRACT, 4, 0)
extb = tm.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
bit = tm.mkOp(Kind.BITVECTOR_BIT, 4)
bitb = tm.mkTerm(bit, b)
assert bitb.getKind() == Kind.BITVECTOR_BIT
assert bitb.hasOp()
assert bitb.getOp() == bit
assert bitb.getOp().isIndexed()
assert bit.getNumIndices() == 1
assert bit[0] == tm.mkInteger(4)
f = tm.mkConst(funsort, "f")
fx = tm.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 == tm.mkTerm(fx.getOp(), *children)
# Test Datatypes Ops
sort = tm.mkParamSort("T")
listDecl = tm.mkDatatypeDecl("paramlist", [sort])
cons = tm.mkDatatypeConstructorDecl("cons")
nil = tm.mkDatatypeConstructorDecl("nil")
cons.addSelector("head", sort)
cons.addSelectorSelf("tail")
listDecl.addConstructor(cons)
listDecl.addConstructor(nil)
listSort = tm.mkDatatypeSort(listDecl)
intListSort = listSort.instantiate([tm.getIntegerSort()])
c = tm.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 = tm.mkTerm(Kind.APPLY_CONSTRUCTOR, nilOpTerm)
consTerm = tm.mkTerm(Kind.APPLY_CONSTRUCTOR, consOpTerm,
tm.mkInteger(0), nilTerm)
headTerm = tm.mkTerm(Kind.APPLY_SELECTOR, headOpTerm, consTerm)
tailTerm = tm.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 == tm.mkTerm(headTerm.getOp(), *children)
def test_has_get_symbol(tm):
t = tm.mkBoolean(True)
c = tm.mkConst(tm.getBooleanSort(), "|\\|")
assert not t.hasSymbol()
assert c.hasSymbol()
with pytest.raises(RuntimeError):
t.getSymbol()
assert c.getSymbol() == "|\\|"
def test_is_null(tm):
x = tm.mkVar(tm.mkBitVectorSort(4), "x")
assert not x.isNull()
def test_not_term(tm):
bvSort = tm.mkBitVectorSort(8)
intSort = tm.getIntegerSort()
boolSort = tm.getBooleanSort()
funSort1 = tm.mkFunctionSort(bvSort, intSort)
funSort2 = tm.mkFunctionSort(intSort, boolSort)
b = tm.mkTrue()
b.notTerm()
x = tm.mkVar(tm.mkBitVectorSort(8), "x")
with pytest.raises(RuntimeError):
x.notTerm()
f = tm.mkVar(funSort1, "f")
with pytest.raises(RuntimeError):
f.notTerm()
p = tm.mkVar(funSort2, "p")
with pytest.raises(RuntimeError):
p.notTerm()
zero = tm.mkInteger(0)
with pytest.raises(RuntimeError):
zero.notTerm()
f_x = tm.mkTerm(Kind.APPLY_UF, f, x)
with pytest.raises(RuntimeError):
f_x.notTerm()
sum = tm.mkTerm(Kind.ADD, f_x, f_x)
with pytest.raises(RuntimeError):
sum.notTerm()
p_0 = tm.mkTerm(Kind.APPLY_UF, p, zero)
p_0.notTerm()
p_f_x = tm.mkTerm(Kind.APPLY_UF, p, f_x)
p_f_x.notTerm()
def test_and_term(tm):
bvSort = tm.mkBitVectorSort(8)
intSort = tm.getIntegerSort()
boolSort = tm.getBooleanSort()
funSort1 = tm.mkFunctionSort(bvSort, intSort)
funSort2 = tm.mkFunctionSort(intSort, boolSort)
b = tm.mkTrue()
b.andTerm(b)
x = tm.mkVar(tm.mkBitVectorSort(8), "x")
with pytest.raises(RuntimeError):
x.andTerm(b)
with pytest.raises(RuntimeError):
x.andTerm(x)
f = tm.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 = tm.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 = tm.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 = tm.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 = tm.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 = tm.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 = tm.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(tm):
bvSort = tm.mkBitVectorSort(8)
intSort = tm.getIntegerSort()
boolSort = tm.getBooleanSort()
funSort1 = tm.mkFunctionSort(bvSort, intSort)
funSort2 = tm.mkFunctionSort(intSort, boolSort)
b = tm.mkTrue()
b.orTerm(b)
x = tm.mkVar(tm.mkBitVectorSort(8), "x")
with pytest.raises(RuntimeError):
x.orTerm(b)
with pytest.raises(RuntimeError):
x.orTerm(x)
f = tm.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 = tm.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 = tm.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 = tm.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 = tm.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 = tm.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 = tm.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(tm):
bvSort = tm.mkBitVectorSort(8)
intSort = tm.getIntegerSort()
boolSort = tm.getBooleanSort()
funSort1 = tm.mkFunctionSort(bvSort, intSort)
funSort2 = tm.mkFunctionSort(intSort, boolSort)
b = tm.mkTrue()
b.xorTerm(b)
x = tm.mkVar(tm.mkBitVectorSort(8), "x")
with pytest.raises(RuntimeError):
x.xorTerm(b)
with pytest.raises(RuntimeError):
x.xorTerm(x)
f = tm.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 = tm.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 = tm.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 = tm.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 = tm.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 = tm.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 = tm.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(tm):
bvSort = tm.mkBitVectorSort(8)
intSort = tm.getIntegerSort()
boolSort = tm.getBooleanSort()
funSort1 = tm.mkFunctionSort(bvSort, intSort)
funSort2 = tm.mkFunctionSort(intSort, boolSort)
b = tm.mkTrue()
b.eqTerm(b)
x = tm.mkVar(tm.mkBitVectorSort(8), "x")
with pytest.raises(RuntimeError):
x.eqTerm(b)
x.eqTerm(x)
f = tm.mkVar(funSort1, "f")
with pytest.raises(RuntimeError):
f.eqTerm(b)
with pytest.raises(RuntimeError):
f.eqTerm(x)
f.eqTerm(f)
p = tm.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 = tm.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 = tm.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 = tm.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 = tm.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 = tm.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(tm):
bvSort = tm.mkBitVectorSort(8)
intSort = tm.getIntegerSort()
boolSort = tm.getBooleanSort()
funSort1 = tm.mkFunctionSort(bvSort, intSort)
funSort2 = tm.mkFunctionSort(intSort, boolSort)
b = tm.mkTrue()
b.impTerm(b)
x = tm.mkVar(tm.mkBitVectorSort(8), "x")
with pytest.raises(RuntimeError):
x.impTerm(b)
with pytest.raises(RuntimeError):
x.impTerm(x)
f = tm.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 = tm.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 = tm.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 = tm.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 = tm.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 = tm.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 = tm.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(tm):
bvSort = tm.mkBitVectorSort(8)
intSort = tm.getIntegerSort()
boolSort = tm.getBooleanSort()
funSort1 = tm.mkFunctionSort(bvSort, intSort)
funSort2 = tm.mkFunctionSort(intSort, boolSort)
b = tm.mkTrue()
b.iteTerm(b, b)
x = tm.mkVar(tm.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 = tm.mkVar(funSort1, "f")
with pytest.raises(RuntimeError):
f.iteTerm(b, b)
with pytest.raises(RuntimeError):
x.iteTerm(b, x)
p = tm.mkVar(funSort2, "p")
with pytest.raises(RuntimeError):
p.iteTerm(b, b)
with pytest.raises(RuntimeError):
p.iteTerm(x, b)
zero = tm.mkInteger(0)
with pytest.raises(RuntimeError):
zero.iteTerm(x, x)
with pytest.raises(RuntimeError):
zero.iteTerm(x, b)
f_x = tm.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 = tm.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 = tm.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 = tm.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(tm):
t1 = tm.mkInteger(1)
t2 = t1
t2 = tm.mkInteger(2)
assert t1 == tm.mkInteger(1)
def test_substitute(tm):
x = tm.mkConst(tm.getIntegerSort(), "x")
one = tm.mkInteger(1)
ttrue = tm.mkTrue()
xpx = tm.mkTerm(Kind.ADD, x, x)
onepone = tm.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 = tm.mkConst(tm.getIntegerSort(), "y")
xpy = tm.mkTerm(Kind.ADD, x, y)
xpone = tm.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)
def test_term_compare(tm):
t1 = tm.mkInteger(1)
t2 = tm.mkTerm(Kind.ADD, tm.mkInteger(2), tm.mkInteger(2))
t3 = tm.mkTerm(Kind.ADD, tm.mkInteger(2), tm.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(tm):
# simple term 2+3
two = tm.mkInteger(2)
t1 = tm.mkTerm(Kind.ADD, two, tm.mkInteger(3))
assert t1[0] == two
assert t1.getNumChildren() == 2
# apply term f(2)
intSort = tm.getIntegerSort()
fsort = tm.mkFunctionSort(intSort, intSort)
f = tm.mkConst(fsort, "f")
t2 = tm.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
def test_get_const_array_base(tm):
intsort = tm.getIntegerSort()
arrsort = tm.mkArraySort(intsort, intsort)
one = tm.mkInteger(1)
constarr = tm.mkConstArray(arrsort, one)
assert constarr.isConstArray()
assert one == constarr.getConstArrayBase()
with pytest.raises(RuntimeError):
one.getConstArrayBase()
a = tm.mkConst(arrsort, "a")
with pytest.raises(RuntimeError):
a.getConstArrayBase()
def test_get_uninterpreted_sort_value(tm, solver):
Unify abstract values and uninterpreted constants (#7424) This commit unifies abstract values and "uninterpreted constants" into a single kind. Note that "uninterpreted constants" is a bit of a misnomer in the context of the new API, since they do not correspond to the equivalent of a declare-const command, but instead are values for symbols of an uninterpreted sort (and thus special cases of abstract values). Instead of treating "uninterpreted constants" as a separate kind, this commit extends abstract values to hold a type (instead of marking their type via attribute in NodeManager::mkAbstractValue()) and uses the type of the abstract values to determine whether they are a value for a constant of uninterpreted sort or not. Unifying these representations simplifies code and brings the terminology more in line with the SMT-LIB standard. This commit also updates the APIs to remove support for creating abstract values and "uninterpreted constants". Users should never create those. They can only be returned as a value for a term after a satisfiability check. Finally, the commit removes code in the parser for parsing abstract values and updates the code for getting values involving abstract values. Since the parser does not allow the declaration/definition of abstract values, and determining whether a symbol is an abstract value was broken (not all symbols starting with an @ are abstract values), the code was effectively dead. Getting values involving "uninterpreted constants" now no longer requires parsing the string of the values, but instead, we can use existing API functionality.
2022-01-12 17:42:26 -08:00
solver.setOption("produce-models", "true")
uSort = tm.mkUninterpretedSort("u")
x = tm.mkConst(uSort, "x")
y = tm.mkConst(uSort, "y")
solver.assertFormula(tm.mkTerm(Kind.EQUAL, x, y))
Unify abstract values and uninterpreted constants (#7424) This commit unifies abstract values and "uninterpreted constants" into a single kind. Note that "uninterpreted constants" is a bit of a misnomer in the context of the new API, since they do not correspond to the equivalent of a declare-const command, but instead are values for symbols of an uninterpreted sort (and thus special cases of abstract values). Instead of treating "uninterpreted constants" as a separate kind, this commit extends abstract values to hold a type (instead of marking their type via attribute in NodeManager::mkAbstractValue()) and uses the type of the abstract values to determine whether they are a value for a constant of uninterpreted sort or not. Unifying these representations simplifies code and brings the terminology more in line with the SMT-LIB standard. This commit also updates the APIs to remove support for creating abstract values and "uninterpreted constants". Users should never create those. They can only be returned as a value for a term after a satisfiability check. Finally, the commit removes code in the parser for parsing abstract values and updates the code for getting values involving abstract values. Since the parser does not allow the declaration/definition of abstract values, and determining whether a symbol is an abstract value was broken (not all symbols starting with an @ are abstract values), the code was effectively dead. Getting values involving "uninterpreted constants" now no longer requires parsing the string of the values, but instead, we can use existing API functionality.
2022-01-12 17:42:26 -08:00
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(tm):
assert not tm.mkInteger(15).isRoundingModeValue()
assert tm.mkRoundingMode(
RoundingMode.ROUND_NEAREST_TIES_TO_EVEN).isRoundingModeValue()
assert not tm.mkConst(
tm.getRoundingModeSort()).isRoundingModeValue()
def test_get_rounding_mode_value(tm):
with pytest.raises(RuntimeError):
tm.mkInteger(15).getRoundingModeValue()
assert tm.mkRoundingMode(
RoundingMode.ROUND_NEAREST_TIES_TO_EVEN).getRoundingModeValue(
) == RoundingMode.ROUND_NEAREST_TIES_TO_EVEN
assert tm.mkRoundingMode(
RoundingMode.ROUND_TOWARD_POSITIVE).getRoundingModeValue(
) == RoundingMode.ROUND_TOWARD_POSITIVE
assert tm.mkRoundingMode(
RoundingMode.ROUND_TOWARD_NEGATIVE).getRoundingModeValue(
) == RoundingMode.ROUND_TOWARD_NEGATIVE
assert tm.mkRoundingMode(
RoundingMode.ROUND_TOWARD_ZERO).getRoundingModeValue(
) == RoundingMode.ROUND_TOWARD_ZERO
assert tm.mkRoundingMode(
RoundingMode.ROUND_NEAREST_TIES_TO_AWAY).getRoundingModeValue(
) == RoundingMode.ROUND_NEAREST_TIES_TO_AWAY
def test_get_tuple(tm):
t1 = tm.mkInteger(15)
t2 = tm.mkReal(17, 25)
t3 = tm.mkString("abc")
tup = tm.mkTuple([t1, t2, t3])
assert tup.isTupleValue()
assert [t1, t2, t3] == tup.getTupleValue()
def test_get_set(tm, solver):
s = tm.mkSetSort(tm.getIntegerSort())
i1 = tm.mkInteger(5)
i2 = tm.mkInteger(7)
s1 = tm.mkEmptySet(s)
s2 = tm.mkTerm(Kind.SET_SINGLETON, i1)
s3 = tm.mkTerm(Kind.SET_SINGLETON, i1)
s4 = tm.mkTerm(Kind.SET_SINGLETON, i2)
s5 = tm.mkTerm(
Kind.SET_UNION, s2, tm.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(tm, solver):
s = tm.mkSequenceSort(tm.getIntegerSort())
i1 = tm.mkInteger(5)
i2 = tm.mkInteger(7)
s1 = tm.mkEmptySequence(s)
s2 = tm.mkTerm(Kind.SEQ_UNIT, i1)
s3 = tm.mkTerm(Kind.SEQ_UNIT, i1)
s4 = tm.mkTerm(Kind.SEQ_UNIT, i2)
s5 = tm.mkTerm(Kind.SEQ_CONCAT, s2,
tm.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(tm):
bvval = tm.mkBitVector(16, "0000110000000011", 2)
fp = tm.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 tm.mkFloatingPointPosZero(5, 11).isFloatingPointPosZero()
assert tm.mkFloatingPointNegZero(5, 11).isFloatingPointNegZero()
assert tm.mkFloatingPointPosInf(5, 11).isFloatingPointPosInf()
assert tm.mkFloatingPointNegInf(5, 11).isFloatingPointNegInf()
assert tm.mkFloatingPointNaN(5, 11).isFloatingPointNaN()
def test_is_integer(tm):
int1 = tm.mkInteger("-18446744073709551616")
int2 = tm.mkInteger("-18446744073709551615")
int3 = tm.mkInteger("-4294967296")
int4 = tm.mkInteger("-4294967295")
int5 = tm.mkInteger("-10")
int6 = tm.mkInteger("0")
int7 = tm.mkInteger("10")
int8 = tm.mkInteger("4294967295")
int9 = tm.mkInteger("4294967296")
int10 = tm.mkInteger("18446744073709551615")
int11 = tm.mkInteger("18446744073709551616")
int12 = tm.mkInteger("-0")
with pytest.raises(RuntimeError):
tm.mkInteger("")
with pytest.raises(RuntimeError):
tm.mkInteger("-")
with pytest.raises(RuntimeError):
tm.mkInteger("-1-")
with pytest.raises(RuntimeError):
tm.mkInteger("0.0")
with pytest.raises(RuntimeError):
tm.mkInteger("-0.1")
with pytest.raises(RuntimeError):
tm.mkInteger("012")
with pytest.raises(RuntimeError):
tm.mkInteger("0000")
with pytest.raises(RuntimeError):
tm.mkInteger("-01")
with pytest.raises(RuntimeError):
tm.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(tm):
s1 = tm.mkString("abcde")
assert s1.isStringValue()
assert s1.getStringValue() == str("abcde")
def test_get_real(tm):
real1 = tm.mkReal("0")
real2 = tm.mkReal(".0")
real3 = tm.mkReal("-17")
real4 = tm.mkReal("-3/5")
real5 = tm.mkReal("12.7")
real6 = tm.mkReal("1/4294967297")
real7 = tm.mkReal("4294967297")
real8 = tm.mkReal("1/18446744073709551617")
real9 = tm.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 = tm.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 = tm.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()
with pytest.raises(RuntimeError):
tm.mkReal("1/0")
with pytest.raises(RuntimeError):
tm.mkReal("2/0000")
def test_get_boolean(tm):
b1 = tm.mkBoolean(True)
b2 = tm.mkBoolean(False)
assert b1.isBooleanValue()
assert b2.isBooleanValue()
assert b1.getBooleanValue()
assert not b2.getBooleanValue()
def test_get_bit_vector(tm):
b1 = tm.mkBitVector(8, 15)
b2 = tm.mkBitVector(8, "00001111", 2)
b3 = tm.mkBitVector(8, "15", 10)
b4 = tm.mkBitVector(8, "0f", 16)
b5 = tm.mkBitVector(9, "00001111", 2);
b6 = tm.mkBitVector(9, "15", 10);
b7 = tm.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(tm):
intsort = tm.getIntegerSort()
arrsort = tm.mkArraySort(intsort, intsort)
a = tm.mkConst(arrsort, "a")
one = tm.mkInteger(1)
two = tm.mkBitVector(2, 2)
iconst = tm.mkConst(intsort)
constarr = tm.mkConstArray(arrsort, one)
with pytest.raises(RuntimeError):
tm.mkConstArray(arrsort, two)
with pytest.raises(RuntimeError):
tm.mkConstArray(arrsort, iconst)
assert constarr.getKind() == Kind.CONST_ARRAY
assert constarr.getConstArrayBase() == one
with pytest.raises(RuntimeError):
a.getConstArrayBase()
arrsort = tm.mkArraySort(tm.getRealSort(), tm.getRealSort())
zero_array = tm.mkConstArray(arrsort, tm.mkReal(0))
stores = tm.mkTerm(Kind.STORE, zero_array, tm.mkReal(1),
tm.mkReal(2))
stores = tm.mkTerm(Kind.STORE, stores, tm.mkReal(2),
tm.mkReal(3))
stores = tm.mkTerm(Kind.STORE, stores, tm.mkReal(4),
tm.mkReal(5))
def test_const_sequence_elements(tm):
realsort = tm.getRealSort()
seqsort = tm.mkSequenceSort(realsort)
s = tm.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 = tm.mkTerm(Kind.SEQ_UNIT, tm.mkReal(1))
with pytest.raises(RuntimeError):
su.getSequenceValue()
def test_get_cardinality_constraint(tm):
su = tm.mkUninterpretedSort("u")
t = tm.mkCardinalityConstraint(su, 3)
assert t.isCardinalityConstraint()
cc = t.getCardinalityConstraint()
assert cc[0] == su
assert cc[1] == 3
x = tm.mkConst(tm.getIntegerSort(), "x")
assert not x.isCardinalityConstraint()
2023-08-10 11:14:41 -05:00
with pytest.raises(RuntimeError):
x.getCardinalityConstraint()
def test_get_real_algebraic_number(tm, solver):
solver.setOption("produce-models", "true")
solver.setLogic("QF_NRA")
realsort = tm.getRealSort()
x = tm.mkConst(realsort, "x")
x2 = tm.mkTerm(Kind.MULT, x, x)
two = tm.mkReal(2, 1)
eq = tm.mkTerm(Kind.EQUAL, x2, two)
solver.assertFormula(eq)
# Note that check-sat should only return "sat" if libpoly is enabled.
# Otherwise, we do not test the following functionality.
if solver.checkSat().isSat():
# We find a model for (x*x = 2), where x should be a real algebraic number.
# We assert that its defining polynomial is non-null and its lower and
# upper bounds are real.
vx = solver.getValue(x)
assert vx.isRealAlgebraicNumber()
y = tm.mkVar(realsort, "y")
poly = vx.getRealAlgebraicNumberDefiningPolynomial(y)
assert not poly.isNull()
lb = vx.getRealAlgebraicNumberLowerBound()
assert lb.isRealValue()
ub = vx.getRealAlgebraicNumberUpperBound()
assert ub.isRealValue()
# cannot call with non-variable
yc = tm.mkConst(realsort, "y")
with pytest.raises(RuntimeError):
vx.getRealAlgebraicNumberDefiningPolynomial(yc)
def test_get_skolem(tm, solver):
# ordinary variables are not skolems
x = tm.mkConst(tm.getIntegerSort(), "x")
assert not x.isSkolem()
with pytest.raises(RuntimeError):
x.getSkolemId()
with pytest.raises(RuntimeError):
x.getSkolemIndices()
def test_term_scoped_to_string(tm):
intsort = tm.getIntegerSort()
x = tm.mkConst(intsort, "x")
assert str(x) == "x"
tm2 = cvc5.Solver(tm)
assert str(x) == "x"