This fixes the type rule for to_real to match SMT-LIB: its argument must be an integer.
This required fixing the TPTP parser which has a more relaxed semantics for to_real / to_rat.
This also fixes Solver::isReal, which should return false if we are the integer type.
Fixes #6208.
{
CVC4_API_TRY_CATCH_BEGIN;
//////// all checks before this line
- return d_type->isReal();
+ // notice that we do not expose internal subtyping to the user
+ return d_type->isReal() && !d_type->isInteger();
////////
CVC4_API_TRY_CATCH_END;
}
}
// Integers are reals, too
- Assert(t.isReal());
+ Assert(t.d_type->isReal());
Term res = term;
if (t.isInteger())
{
{
return d_solver->mkTerm(api::UMINUS, args[0]);
}
+ if (kind == api::TO_REAL)
+ {
+ // If the type is real, this is a no-op. We require this special
+ // case in the TPTP parser since TO_REAL is designed to match the
+ // SMT-LIB operator, meaning it can only be applied to integers, whereas
+ // the TPTP to_real / to_rat do not have the same semantics.
+ api::Sort s = args[0].getSort();
+ if (s.isReal())
+ {
+ return args[0];
+ }
+ }
return d_solver->mkTerm(kind, args);
}
TNode::iterator child_it = n.begin();
TNode::iterator child_it_end = n.end();
bool isInteger = true;
+ Kind k = n.getKind();
for(; child_it != child_it_end; ++child_it) {
TypeNode childType = (*child_it).getType(check);
if (!childType.isInteger()) {
if(!childType.isReal()) {
throw TypeCheckingExceptionPrivate(n, "expecting an arithmetic subterm");
}
+ if (k == kind::TO_REAL && !childType.isInteger())
+ {
+ throw TypeCheckingExceptionPrivate(n, "expecting an integer subterm");
+ }
}
}
- switch (Kind k = n.getKind())
+ switch (k)
{
case kind::TO_REAL:
case kind::CAST_TO_REAL: return realType;
TEST_F(TestApiBlackSort, isInteger)
{
ASSERT_TRUE(d_solver.getIntegerSort().isInteger());
+ ASSERT_TRUE(!d_solver.getRealSort().isInteger());
ASSERT_NO_THROW(Sort().isInteger());
}
TEST_F(TestApiBlackSort, isReal)
{
ASSERT_TRUE(d_solver.getRealSort().isReal());
+ ASSERT_TRUE(!d_solver.getIntegerSort().isReal());
ASSERT_NO_THROW(Sort().isReal());
}