mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 12:08:18 +00:00
merge get_value and get_ivalue that produced different results
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
2ab0681381
commit
46ea054784
|
@ -115,7 +115,6 @@ void prove_example1() {
|
||||||
*/
|
*/
|
||||||
void prove_example2() {
|
void prove_example2() {
|
||||||
std::cout << "prove_example1\n";
|
std::cout << "prove_example1\n";
|
||||||
|
|
||||||
context c;
|
context c;
|
||||||
expr x = c.int_const("x");
|
expr x = c.int_const("x");
|
||||||
expr y = c.int_const("y");
|
expr y = c.int_const("y");
|
||||||
|
@ -139,6 +138,7 @@ void prove_example2() {
|
||||||
s.reset();
|
s.reset();
|
||||||
s.add(!conjecture2);
|
s.add(!conjecture2);
|
||||||
std::cout << "conjecture 2:\n" << conjecture2 << "\n";
|
std::cout << "conjecture 2:\n" << conjecture2 << "\n";
|
||||||
|
|
||||||
if (s.check() == unsat) {
|
if (s.check() == unsat) {
|
||||||
std::cout << "proved" << "\n";
|
std::cout << "proved" << "\n";
|
||||||
}
|
}
|
||||||
|
|
|
@ -802,7 +802,7 @@ public:
|
||||||
m_num_conflicts(0),
|
m_num_conflicts(0),
|
||||||
m_use_nra_model(false),
|
m_use_nra_model(false),
|
||||||
m_model_eqs(DEFAULT_HASHTABLE_INITIAL_CAPACITY, var_value_hash(*this), var_value_eq(*this)),
|
m_model_eqs(DEFAULT_HASHTABLE_INITIAL_CAPACITY, var_value_hash(*this), var_value_eq(*this)),
|
||||||
m_solver(0),
|
m_solver(nullptr),
|
||||||
m_resource_limit(*this) {
|
m_resource_limit(*this) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1115,8 +1115,7 @@ public:
|
||||||
return
|
return
|
||||||
(v != null_theory_var) &&
|
(v != null_theory_var) &&
|
||||||
(v < static_cast<theory_var>(m_theory_var2var_index.size())) &&
|
(v < static_cast<theory_var>(m_theory_var2var_index.size())) &&
|
||||||
(UINT_MAX != m_theory_var2var_index[v]) &&
|
(UINT_MAX != m_theory_var2var_index[v]);
|
||||||
(m_solver->is_term(m_theory_var2var_index[v]) || m_variable_values.count(m_theory_var2var_index[v]) > 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool can_get_bound(theory_var v) const {
|
bool can_get_bound(theory_var v) const {
|
||||||
|
@ -1136,7 +1135,7 @@ public:
|
||||||
mutable vector<std::pair<lp::var_index, rational>> m_todo_terms;
|
mutable vector<std::pair<lp::var_index, rational>> m_todo_terms;
|
||||||
|
|
||||||
lp::impq get_ivalue(theory_var v) const {
|
lp::impq get_ivalue(theory_var v) const {
|
||||||
lp_assert(can_get_ivalue(v));
|
SASSERT(can_get_ivalue(v));
|
||||||
lp::var_index vi = m_theory_var2var_index[v];
|
lp::var_index vi = m_theory_var2var_index[v];
|
||||||
if (!m_solver->is_term(vi))
|
if (!m_solver->is_term(vi))
|
||||||
return m_solver->get_column_value(vi);
|
return m_solver->get_column_value(vi);
|
||||||
|
@ -1161,30 +1160,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
rational get_value(theory_var v) const {
|
rational get_value(theory_var v) const {
|
||||||
if (!can_get_value(v)) return rational::zero();
|
return get_ivalue(v).x;
|
||||||
lp::var_index vi = m_theory_var2var_index[v];
|
|
||||||
if (m_variable_values.count(vi) > 0) {
|
|
||||||
return m_variable_values[vi];
|
|
||||||
}
|
|
||||||
m_todo_terms.push_back(std::make_pair(vi, rational::one()));
|
|
||||||
rational result(0);
|
|
||||||
while (!m_todo_terms.empty()) {
|
|
||||||
lp::var_index wi = m_todo_terms.back().first;
|
|
||||||
rational coeff = m_todo_terms.back().second;
|
|
||||||
m_todo_terms.pop_back();
|
|
||||||
if (m_solver->is_term(wi)) {
|
|
||||||
const lp::lar_term& term = m_solver->get_term(wi);
|
|
||||||
result += term.m_v * coeff;
|
|
||||||
for (auto const& i : term.m_coeffs) {
|
|
||||||
m_todo_terms.push_back(std::make_pair(i.first, i.second * coeff));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
result += m_variable_values[wi] * coeff;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_variable_values[vi] = result;
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_variable_values() {
|
void init_variable_values() {
|
||||||
|
@ -1198,6 +1174,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
bool assume_eqs() {
|
bool assume_eqs() {
|
||||||
|
reset_variable_values();
|
||||||
svector<lp::var_index> vars;
|
svector<lp::var_index> vars;
|
||||||
theory_var sz = static_cast<theory_var>(th.get_num_vars());
|
theory_var sz = static_cast<theory_var>(th.get_num_vars());
|
||||||
for (theory_var v = 0; v < sz; ++v) {
|
for (theory_var v = 0; v < sz; ++v) {
|
||||||
|
@ -1211,11 +1188,10 @@ public:
|
||||||
TRACE("arith",
|
TRACE("arith",
|
||||||
for (theory_var v = 0; v < sz; ++v) {
|
for (theory_var v = 0; v < sz; ++v) {
|
||||||
if (th.is_relevant_and_shared(get_enode(v))) {
|
if (th.is_relevant_and_shared(get_enode(v))) {
|
||||||
tout << "v" << v << " " << m_theory_var2var_index[v] << " ";
|
tout << "v" << v << " ";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tout << "\n";
|
tout << "\n"; );
|
||||||
);
|
|
||||||
if (!m_use_nra_model) {
|
if (!m_use_nra_model) {
|
||||||
m_solver->random_update(vars.size(), vars.c_ptr());
|
m_solver->random_update(vars.size(), vars.c_ptr());
|
||||||
}
|
}
|
||||||
|
@ -1229,12 +1205,15 @@ public:
|
||||||
theory_var v = (i + start) % sz;
|
theory_var v = (i + start) % sz;
|
||||||
enode* n1 = get_enode(v);
|
enode* n1 = get_enode(v);
|
||||||
if (!th.is_relevant_and_shared(n1)) {
|
if (!th.is_relevant_and_shared(n1)) {
|
||||||
|
TRACE("arith", tout << "not relevant v" << v << "\n";);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!can_get_ivalue(v)) {
|
if (!can_get_ivalue(v)) {
|
||||||
|
TRACE("arith", tout << "no ivalue for v" << v << "\n";);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
theory_var other = m_model_eqs.insert_if_not_there(v);
|
theory_var other = m_model_eqs.insert_if_not_there(v);
|
||||||
|
TRACE("arith", tout << "insert: v" << v << " := " << get_ivalue(v) << " found: v" << other << "\n";);
|
||||||
if (other == v) {
|
if (other == v) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -2527,19 +2506,23 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
justification * why_is_diseq(theory_var v1, theory_var v2) {
|
justification * why_is_diseq(theory_var v1, theory_var v2) {
|
||||||
return 0;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void reset_eh() {
|
void reset_eh() {
|
||||||
|
m_use_nra_model = false;
|
||||||
m_arith_eq_adapter.reset_eh();
|
m_arith_eq_adapter.reset_eh();
|
||||||
m_solver = 0;
|
m_solver = nullptr;
|
||||||
|
m_internalize_head = 0;
|
||||||
m_not_handled = nullptr;
|
m_not_handled = nullptr;
|
||||||
del_bounds(0);
|
del_bounds(0);
|
||||||
m_unassigned_bounds.reset();
|
m_unassigned_bounds.reset();
|
||||||
m_asserted_qhead = 0;
|
m_asserted_qhead = 0;
|
||||||
|
m_assume_eq_head = 0;
|
||||||
m_scopes.reset();
|
m_scopes.reset();
|
||||||
m_stats.reset();
|
m_stats.reset();
|
||||||
m_to_check.reset();
|
m_to_check.reset();
|
||||||
|
reset_variable_values();
|
||||||
}
|
}
|
||||||
|
|
||||||
void init_model(model_generator & mg) {
|
void init_model(model_generator & mg) {
|
||||||
|
|
Loading…
Reference in a new issue