mirror of
https://github.com/Z3Prover/z3
synced 2025-06-05 13:51:23 +00:00
SMT2 compliancy fix; NRA includes conversion of Int numerals
This commit is contained in:
parent
0c4b792dac
commit
041520f727
2 changed files with 36 additions and 25 deletions
|
@ -285,7 +285,8 @@ arith_decl_plugin::arith_decl_plugin():
|
||||||
m_idiv_0_decl(0),
|
m_idiv_0_decl(0),
|
||||||
m_mod_0_decl(0),
|
m_mod_0_decl(0),
|
||||||
m_u_asin_decl(0),
|
m_u_asin_decl(0),
|
||||||
m_u_acos_decl(0) {
|
m_u_acos_decl(0),
|
||||||
|
m_convert_int_numerals_to_real(false) {
|
||||||
}
|
}
|
||||||
|
|
||||||
arith_decl_plugin::~arith_decl_plugin() {
|
arith_decl_plugin::~arith_decl_plugin() {
|
||||||
|
@ -418,7 +419,7 @@ app * arith_decl_plugin::mk_numeral(rational const & val, bool is_int) {
|
||||||
if (val.is_unsigned()) {
|
if (val.is_unsigned()) {
|
||||||
unsigned u_val = val.get_unsigned();
|
unsigned u_val = val.get_unsigned();
|
||||||
if (u_val < MAX_SMALL_NUM_TO_CACHE) {
|
if (u_val < MAX_SMALL_NUM_TO_CACHE) {
|
||||||
if (is_int) {
|
if (is_int && !m_convert_int_numerals_to_real) {
|
||||||
app * r = m_small_ints.get(u_val, 0);
|
app * r = m_small_ints.get(u_val, 0);
|
||||||
if (r == 0) {
|
if (r == 0) {
|
||||||
parameter p[2] = { parameter(val), parameter(1) };
|
parameter p[2] = { parameter(val), parameter(1) };
|
||||||
|
@ -442,7 +443,7 @@ app * arith_decl_plugin::mk_numeral(rational const & val, bool is_int) {
|
||||||
}
|
}
|
||||||
parameter p[2] = { parameter(val), parameter(static_cast<int>(is_int)) };
|
parameter p[2] = { parameter(val), parameter(static_cast<int>(is_int)) };
|
||||||
func_decl * decl;
|
func_decl * decl;
|
||||||
if (is_int)
|
if (is_int && !m_convert_int_numerals_to_real)
|
||||||
decl = m_manager->mk_const_decl(m_intv_sym, m_int_decl, func_decl_info(m_family_id, OP_NUM, 2, p));
|
decl = m_manager->mk_const_decl(m_intv_sym, m_int_decl, func_decl_info(m_family_id, OP_NUM, 2, p));
|
||||||
else
|
else
|
||||||
decl = m_manager->mk_const_decl(m_realv_sym, m_real_decl, func_decl_info(m_family_id, OP_NUM, 2, p));
|
decl = m_manager->mk_const_decl(m_realv_sym, m_real_decl, func_decl_info(m_family_id, OP_NUM, 2, p));
|
||||||
|
@ -521,9 +522,17 @@ func_decl * arith_decl_plugin::mk_func_decl(decl_kind k, unsigned num_parameters
|
||||||
}
|
}
|
||||||
|
|
||||||
void arith_decl_plugin::get_sort_names(svector<builtin_name>& sort_names, symbol const & logic) {
|
void arith_decl_plugin::get_sort_names(svector<builtin_name>& sort_names, symbol const & logic) {
|
||||||
|
if (logic == "NRA" ||
|
||||||
|
logic == "QF_NRA" ||
|
||||||
|
logic == "QF_UFNRA") {
|
||||||
|
m_convert_int_numerals_to_real = true;
|
||||||
|
sort_names.push_back(builtin_name("Real", REAL_SORT));
|
||||||
|
}
|
||||||
|
else {
|
||||||
// TODO: only define Int and Real in the right logics
|
// TODO: only define Int and Real in the right logics
|
||||||
sort_names.push_back(builtin_name("Int", INT_SORT));
|
sort_names.push_back(builtin_name("Int", INT_SORT));
|
||||||
sort_names.push_back(builtin_name("Real", REAL_SORT));
|
sort_names.push_back(builtin_name("Real", REAL_SORT));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void arith_decl_plugin::get_op_names(svector<builtin_name>& op_names, symbol const & logic) {
|
void arith_decl_plugin::get_op_names(svector<builtin_name>& op_names, symbol const & logic) {
|
||||||
|
|
|
@ -152,6 +152,8 @@ protected:
|
||||||
ptr_vector<app> m_small_ints;
|
ptr_vector<app> m_small_ints;
|
||||||
ptr_vector<app> m_small_reals;
|
ptr_vector<app> m_small_reals;
|
||||||
|
|
||||||
|
bool m_convert_int_numerals_to_real;
|
||||||
|
|
||||||
func_decl * mk_func_decl(decl_kind k, bool is_real);
|
func_decl * mk_func_decl(decl_kind k, bool is_real);
|
||||||
virtual void set_manager(ast_manager * m, family_id id);
|
virtual void set_manager(ast_manager * m, family_id id);
|
||||||
decl_kind fix_kind(decl_kind k, unsigned arity);
|
decl_kind fix_kind(decl_kind k, unsigned arity);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue