mirror of
https://github.com/Z3Prover/z3
synced 2025-04-12 12:08:18 +00:00
adding placeholder for refining power of 2
This commit is contained in:
parent
0f4f32c5d0
commit
4e6d498a60
|
@ -1556,6 +1556,33 @@ public:
|
||||||
return !m_asserted_atoms.empty();
|
return !m_asserted_atoms.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final_check_status eval_power(expr* e) {
|
||||||
|
return FC_GIVEUP;
|
||||||
|
expr* x, * y;
|
||||||
|
VERIFY(a.is_power(e, x, y));
|
||||||
|
enode* xn = get_enode(x);
|
||||||
|
enode* yn = get_enode(y);
|
||||||
|
if (!xn || !yn)
|
||||||
|
return FC_GIVEUP;
|
||||||
|
rational valx, valy, valn;
|
||||||
|
bool vx = get_value(xn, valx);
|
||||||
|
bool vy = get_value(yn, valy);
|
||||||
|
enode* n = get_enode(e);
|
||||||
|
bool vn = get_value(n, valn);
|
||||||
|
verbose_stream() << vx << " " << valx << " " << vy << " " << valy << "\n";
|
||||||
|
verbose_stream() << vn << " " << valn << "\n";
|
||||||
|
// add tangent lemmas for power:
|
||||||
|
// valx > 0 valy > 0 => n >= rational_floor(valx^valy)
|
||||||
|
// establish equality using algebraic numerals
|
||||||
|
return FC_GIVEUP;
|
||||||
|
}
|
||||||
|
|
||||||
|
final_check_status eval_unsupported(expr* e) {
|
||||||
|
if (a.is_power(e))
|
||||||
|
return eval_power(e);
|
||||||
|
return FC_GIVEUP;
|
||||||
|
}
|
||||||
|
|
||||||
final_check_status final_check_eh() {
|
final_check_status final_check_eh() {
|
||||||
if (propagate_core())
|
if (propagate_core())
|
||||||
return FC_CONTINUE;
|
return FC_CONTINUE;
|
||||||
|
@ -1607,10 +1634,21 @@ public:
|
||||||
for (expr* e : m_not_handled) {
|
for (expr* e : m_not_handled) {
|
||||||
if (!ctx().is_relevant(e))
|
if (!ctx().is_relevant(e))
|
||||||
continue;
|
continue;
|
||||||
(void) e; // just in case TRACE() is a no-op
|
st = FC_DONE;
|
||||||
TRACE("arith", tout << "unhandled operator " << mk_pp(e, m) << "\n";);
|
switch (eval_unsupported(e)) {
|
||||||
st = FC_GIVEUP;
|
case FC_CONTINUE:
|
||||||
}
|
st = FC_CONTINUE;
|
||||||
|
break;
|
||||||
|
case FC_GIVEUP:
|
||||||
|
if (st != FC_CONTINUE)
|
||||||
|
st = FC_GIVEUP;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (st == FC_CONTINUE)
|
||||||
|
break;
|
||||||
|
}
|
||||||
return st;
|
return st;
|
||||||
case l_false:
|
case l_false:
|
||||||
get_infeasibility_explanation_and_set_conflict();
|
get_infeasibility_explanation_and_set_conflict();
|
||||||
|
|
Loading…
Reference in a new issue