mirror of
https://github.com/Z3Prover/z3
synced 2025-08-28 14:08:55 +00:00
merge
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
commit
dc879dc3fb
74 changed files with 585 additions and 259 deletions
|
@ -162,13 +162,13 @@ namespace smt {
|
|||
The variables are replaced by skolem constants. These constants are stored in sks.
|
||||
*/
|
||||
|
||||
void model_checker::assert_neg_q_m(quantifier * q, expr_ref_vector & sks) {
|
||||
bool model_checker::assert_neg_q_m(quantifier * q, expr_ref_vector & sks) {
|
||||
expr_ref tmp(m);
|
||||
|
||||
TRACE("model_checker", tout << "curr_model:\n"; model_pp(tout, *m_curr_model););
|
||||
|
||||
if (!m_curr_model->eval(q->get_expr(), tmp, true)) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
TRACE("model_checker", tout << "q after applying interpretation:\n" << mk_ismt2_pp(tmp, m) << "\n";);
|
||||
ptr_buffer<expr> subst_args;
|
||||
|
@ -191,6 +191,7 @@ namespace smt {
|
|||
r = m.mk_not(sk_body);
|
||||
TRACE("model_checker", tout << "mk_neg_q_m:\n" << mk_ismt2_pp(r, m) << "\n";);
|
||||
m_aux_context->assert_expr(r);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool model_checker::add_instance(quantifier * q, model * cex, expr_ref_vector & sks, bool use_inv) {
|
||||
|
@ -333,7 +334,8 @@ namespace smt {
|
|||
TRACE("model_checker", tout << "model checking:\n" << expr_ref(flat_q->get_expr(), m) << "\n";);
|
||||
expr_ref_vector sks(m);
|
||||
|
||||
assert_neg_q_m(flat_q, sks);
|
||||
if (!assert_neg_q_m(flat_q, sks))
|
||||
return false;
|
||||
TRACE("model_checker", tout << "skolems:\n" << sks << "\n";);
|
||||
|
||||
flet<bool> l(m_aux_context->get_fparams().m_array_fake_support, true);
|
||||
|
|
|
@ -62,7 +62,7 @@ namespace smt {
|
|||
expr * get_type_compatible_term(expr * val);
|
||||
expr_ref replace_value_from_ctx(expr * e);
|
||||
void restrict_to_universe(expr * sk, obj_hashtable<expr> const & universe);
|
||||
void assert_neg_q_m(quantifier * q, expr_ref_vector & sks);
|
||||
bool assert_neg_q_m(quantifier * q, expr_ref_vector & sks);
|
||||
bool add_blocking_clause(model * cex, expr_ref_vector & sks);
|
||||
bool check(quantifier * q);
|
||||
void check_quantifiers(bool& found_relevant, unsigned& num_failures);
|
||||
|
|
|
@ -74,7 +74,6 @@ namespace smt {
|
|||
for (auto const& kv : m_elems) {
|
||||
m.dec_ref(kv.m_key);
|
||||
}
|
||||
m_elems.reset();
|
||||
}
|
||||
|
||||
obj_map<expr, unsigned> const& get_elems() const { return m_elems; }
|
||||
|
|
|
@ -1872,11 +1872,14 @@ public:
|
|||
|
||||
app* theory_seq::get_ite_value(expr* e) {
|
||||
expr* e1, *e2, *e3;
|
||||
while (m.is_ite(e, e1, e2, e3)) {
|
||||
if (get_root(e2) == get_root(e)) {
|
||||
while (m.is_ite(e, e1, e2, e3)) {
|
||||
if (!ctx.e_internalized(e))
|
||||
break;
|
||||
enode* r = ctx.get_enode(e)->get_root();
|
||||
if (ctx.get_enode(e2)->get_root() == r) {
|
||||
e = e2;
|
||||
}
|
||||
else if (get_root(e3) == get_root(e)) {
|
||||
else if (ctx.get_enode(e3)->get_root() == r) {
|
||||
e = e3;
|
||||
}
|
||||
else {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue