mirror of
https://github.com/Z3Prover/z3
synced 2025-07-18 02:16:40 +00:00
working on quantifiers
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
4f7dd08c38
commit
8612c89c54
7 changed files with 146 additions and 39 deletions
|
@ -549,7 +549,7 @@ namespace pdr {
|
|||
}
|
||||
}
|
||||
|
||||
bool model_evaluator::extract_array_func_interp(expr* a, vector<expr_ref_vector>& stores, expr_ref else_case) {
|
||||
bool model_evaluator::extract_array_func_interp(expr* a, vector<expr_ref_vector>& stores, expr_ref& else_case) {
|
||||
SASSERT(m_array.is_array(a));
|
||||
|
||||
while (m_array.is_store(a)) {
|
||||
|
@ -582,6 +582,9 @@ namespace pdr {
|
|||
stores.push_back(store);
|
||||
}
|
||||
else_case = g->get_else();
|
||||
if (!else_case) {
|
||||
return false;
|
||||
}
|
||||
if (!is_ground(else_case)) {
|
||||
return false;
|
||||
}
|
||||
|
@ -903,6 +906,32 @@ namespace pdr {
|
|||
return !has_x;
|
||||
}
|
||||
|
||||
expr_ref model_evaluator::eval(model_ref& model, expr* e) {
|
||||
expr_ref result(m);
|
||||
m_model = model;
|
||||
VERIFY(m_model->eval(e, result, true));
|
||||
if (m_array.is_array(e)) {
|
||||
vector<expr_ref_vector> stores;
|
||||
expr_ref_vector args(m);
|
||||
expr_ref else_case(m);
|
||||
if (extract_array_func_interp(result, stores, else_case)) {
|
||||
result = m_array.mk_const_array(m.get_sort(e), else_case);
|
||||
while (!stores.empty() && stores.back().back() == else_case) {
|
||||
stores.pop_back();
|
||||
}
|
||||
for (unsigned i = stores.size(); i > 0; ) {
|
||||
--i;
|
||||
args.resize(1);
|
||||
args[0] = result;
|
||||
args.append(stores[i]);
|
||||
result = m_array.mk_store(args.size(), args.c_ptr());
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
void reduce_disequalities(model& model, unsigned threshold, expr_ref& fml) {
|
||||
ast_manager& m = fml.get_manager();
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue