3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-11-04 05:19:11 +00:00

fix param evaluation non-determinism

Signed-off-by: Lev Nachmanson <levnach@hotmail.com>
This commit is contained in:
Lev Nachmanson 2025-10-30 07:16:18 -07:00
parent 3c5cb7c044
commit 02290e8736
4 changed files with 92 additions and 56 deletions

View file

@ -274,8 +274,9 @@ interval & interval::operator-=(interval const & other) {
}
v_dependency * interval::join(v_dependency * d1, v_dependency * d2, v_dependency * d3, v_dependency * d4) {
// TODO: non-deterministic parameter evaluation
return m_manager.mk_join(m_manager.mk_join(d1, d2), m_manager.mk_join(d3,d4));
v_dependency* first = m_manager.mk_join(d1, d2);
v_dependency* second = m_manager.mk_join(d3, d4);
return m_manager.mk_join(first, second);
}
/**
@ -665,4 +666,3 @@ void interval::display_with_dependencies(std::ostream & out) const {

View file

@ -213,18 +213,25 @@ interval theory_arith<Ext>::mk_interval_for(theory_var v) {
bound * l = lower(v);
bound * u = upper(v);
if (l && u) {
auto const& l_val = l->get_value();
auto const& u_val = u->get_value();
// optimization may introduce non-standard bounds.
if (l->get_value() == u->get_value() && !l->get_value().get_infinitesimal().to_rational().is_zero()) {
if (l_val == u_val && !l_val.get_infinitesimal().to_rational().is_zero()) {
return interval(m_dep_manager);
}
// TODO: non-deterministic parameter evaluation
rational l_rat = l_val.get_rational().to_rational();
bool l_open = l_val.get_infinitesimal().to_rational().is_pos();
v_dependency* l_dep = m_dep_manager.mk_leaf(l);
rational u_rat = u_val.get_rational().to_rational();
bool u_open = u_val.get_infinitesimal().to_rational().is_neg();
v_dependency* u_dep = m_dep_manager.mk_leaf(u);
return interval(m_dep_manager,
l->get_value().get_rational().to_rational(),
l->get_value().get_infinitesimal().to_rational().is_pos(),
m_dep_manager.mk_leaf(l),
u->get_value().get_rational().to_rational(),
u->get_value().get_infinitesimal().to_rational().is_neg(),
m_dep_manager.mk_leaf(u));
l_rat,
l_open,
l_dep,
u_rat,
u_open,
u_dep);
}
else if (l) {
return interval(m_dep_manager,
@ -1712,8 +1719,12 @@ grobner::monomial * theory_arith<Ext>::mk_gb_monomial(rational const & _coeff, e
if (is_fixed(_var)) {
if (!already_found.contains(_var)) {
already_found.insert(_var);
// TODO: non-deterministic parameter evaluation
dep = m_dep_manager.mk_join(dep, m_dep_manager.mk_join(m_dep_manager.mk_leaf(lower(_var)), m_dep_manager.mk_leaf(upper(_var))));
bound* lower_b = lower(_var);
bound* upper_b = upper(_var);
v_dependency* lower_dep = m_dep_manager.mk_leaf(lower_b);
v_dependency* upper_dep = m_dep_manager.mk_leaf(upper_b);
v_dependency* joined_bounds = m_dep_manager.mk_join(lower_dep, upper_dep);
dep = m_dep_manager.mk_join(dep, joined_bounds);
}
coeff *= lower_bound(_var).get_rational().to_rational();
}
@ -1779,8 +1790,12 @@ void theory_arith<Ext>::add_monomial_def_to_gb(theory_var v, grobner & gb) {
monomials.push_back(new_m);
rational coeff(-1);
if (is_fixed(v)) {
// TODO: non-deterministic parameter evaluation
dep = m_dep_manager.mk_join(dep, m_dep_manager.mk_join(m_dep_manager.mk_leaf(lower(v)), m_dep_manager.mk_leaf(upper(v))));
bound* lower_b = lower(v);
bound* upper_b = upper(v);
v_dependency* lower_dep = m_dep_manager.mk_leaf(lower_b);
v_dependency* upper_dep = m_dep_manager.mk_leaf(upper_b);
v_dependency* joined_bounds = m_dep_manager.mk_join(lower_dep, upper_dep);
dep = m_dep_manager.mk_join(dep, joined_bounds);
coeff *= lower_bound(v).get_rational().to_rational();
if (!coeff.is_zero())
monomials.push_back(gb.mk_monomial(coeff, 0, nullptr));
@ -2414,6 +2429,3 @@ final_check_status theory_arith<Ext>::process_non_linear() {
};

View file

@ -34,37 +34,64 @@ Notes:
#include "tactic/smtlogics/smt_tactic.h"
tactic * mk_default_tactic(ast_manager & m, params_ref const & p) {
tactic * st = using_params(and_then(mk_simplify_tactic(m, p),
// TODO: non-deterministic parameter evaluation
// TODO: non-deterministic parameter evaluation
cond(mk_and(mk_is_propositional_probe(), mk_not(mk_produce_proofs_probe())),
mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_fd_tactic(m, p); }),
// TODO: non-deterministic parameter evaluation
cond(mk_is_qfbv_probe(), mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_qfbv_tactic(m, p); }),
// TODO: non-deterministic parameter evaluation
cond(mk_is_qfaufbv_probe(), mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_qfaufbv_tactic(m, p); }),
// TODO: non-deterministic parameter evaluation
cond(mk_is_qflia_probe(), mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_qflia_tactic(m, p); }),
// TODO: non-deterministic parameter evaluation
cond(mk_is_qfauflia_probe(), mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_qfauflia_tactic(m, p); }),
// TODO: non-deterministic parameter evaluation
cond(mk_is_qflra_probe(), mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_qflra_tactic(m, p); }),
// TODO: non-deterministic parameter evaluation
cond(mk_is_qfnra_probe(), mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_qfnra_tactic(m, p); }),
// TODO: non-deterministic parameter evaluation
cond(mk_is_qfnia_probe(), mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_qfnia_tactic(m, p); }),
// TODO: non-deterministic parameter evaluation
cond(mk_is_lira_probe(), mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_lira_tactic(m, p); }),
// TODO: non-deterministic parameter evaluation
cond(mk_is_nra_probe(), mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_nra_tactic(m, p); }),
// TODO: non-deterministic parameter evaluation
cond(mk_is_qffp_probe(), mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_qffp_tactic(m, p); }),
// TODO: non-deterministic parameter evaluation
cond(mk_is_qffplra_probe(), mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_qffplra_tactic(m, p); }),
//cond(mk_is_qfufnra_probe(), mk_qfufnra_tactic(m, p),
// TODO: non-deterministic parameter evaluation
and_then(mk_preamble_tactic(m), mk_lazy_tactic(m, p, [&](auto& m, auto const& p) { return mk_smt_tactic(m, p);}))))))))))))))),
p);
tactic* simplify = mk_simplify_tactic(m, p);
tactic* preamble = mk_preamble_tactic(m);
tactic* lazy_smt = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_smt_tactic(m_ref, p_ref); });
tactic* branch = and_then(preamble, lazy_smt);
tactic* lazy_qffplra = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_qffplra_tactic(m_ref, p_ref); });
probe* qffplra_probe = mk_is_qffplra_probe();
branch = cond(qffplra_probe, lazy_qffplra, branch);
tactic* lazy_qffp = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_qffp_tactic(m_ref, p_ref); });
probe* qffp_probe = mk_is_qffp_probe();
branch = cond(qffp_probe, lazy_qffp, branch);
tactic* lazy_nra = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_nra_tactic(m_ref, p_ref); });
probe* nra_probe = mk_is_nra_probe();
branch = cond(nra_probe, lazy_nra, branch);
tactic* lazy_lira = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_lira_tactic(m_ref, p_ref); });
probe* lira_probe = mk_is_lira_probe();
branch = cond(lira_probe, lazy_lira, branch);
tactic* lazy_qfnia = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_qfnia_tactic(m_ref, p_ref); });
probe* qfnia_probe = mk_is_qfnia_probe();
branch = cond(qfnia_probe, lazy_qfnia, branch);
tactic* lazy_qfnra = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_qfnra_tactic(m_ref, p_ref); });
probe* qfnra_probe = mk_is_qfnra_probe();
branch = cond(qfnra_probe, lazy_qfnra, branch);
tactic* lazy_qflra = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_qflra_tactic(m_ref, p_ref); });
probe* qflra_probe = mk_is_qflra_probe();
branch = cond(qflra_probe, lazy_qflra, branch);
tactic* lazy_qfauflia = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_qfauflia_tactic(m_ref, p_ref); });
probe* qfauflia_probe = mk_is_qfauflia_probe();
branch = cond(qfauflia_probe, lazy_qfauflia, branch);
tactic* lazy_qflia = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_qflia_tactic(m_ref, p_ref); });
probe* qflia_probe = mk_is_qflia_probe();
branch = cond(qflia_probe, lazy_qflia, branch);
tactic* lazy_qfaufbv = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_qfaufbv_tactic(m_ref, p_ref); });
probe* qfaufbv_probe = mk_is_qfaufbv_probe();
branch = cond(qfaufbv_probe, lazy_qfaufbv, branch);
tactic* lazy_qfbv = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_qfbv_tactic(m_ref, p_ref); });
probe* qfbv_probe = mk_is_qfbv_probe();
branch = cond(qfbv_probe, lazy_qfbv, branch);
tactic* lazy_fd = mk_lazy_tactic(m, p, [&](auto& m_ref, auto const& p_ref) { return mk_fd_tactic(m_ref, p_ref); });
probe* propositional_probe = mk_is_propositional_probe();
probe* produce_proofs_probe = mk_produce_proofs_probe();
probe* no_proofs_probe = mk_not(produce_proofs_probe);
probe* propositional_no_proofs = mk_and(propositional_probe, no_proofs_probe);
branch = cond(propositional_no_proofs, lazy_fd, branch);
tactic* combined = and_then(simplify, branch);
tactic * st = using_params(combined, p);
return st;
}

View file

@ -185,10 +185,9 @@ public:
if (!t) {
t = mk_tactic_for_logic(m, p, l);
}
// TODO: non-deterministic parameter evaluation
return mk_combined_solver(mk_tactic2solver(m, t.get(), p, proofs_enabled, models_enabled, unsat_core_enabled, l),
mk_solver_for_logic(m, p, l),
p);
solver* tactic_solver = mk_tactic2solver(m, t.get(), p, proofs_enabled, models_enabled, unsat_core_enabled, l);
solver* logic_solver = mk_solver_for_logic(m, p, l);
return mk_combined_solver(tactic_solver, logic_solver, p);
}
solver_factory* translate(ast_manager& m) override {
@ -199,5 +198,3 @@ public:
solver_factory * mk_smt_strategic_solver_factory(symbol const & logic) {
return alloc(smt_strategic_solver_factory, logic);
}