mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +00:00
merge duality changes with unstable
This commit is contained in:
commit
d815af9f0f
194 changed files with 3554 additions and 1887 deletions
|
@ -1109,11 +1109,11 @@ namespace datalog {
|
|||
|
||||
void context::get_raw_rule_formulas(expr_ref_vector& rules, svector<symbol>& names, vector<unsigned> &bounds){
|
||||
for (unsigned i = 0; i < m_rule_fmls.size(); ++i) {
|
||||
expr_ref r = bind_variables(m_rule_fmls[i].get(), true);
|
||||
rules.push_back(r.get());
|
||||
// rules.push_back(m_rule_fmls[i].get());
|
||||
names.push_back(m_rule_names[i]);
|
||||
bounds.push_back(m_rule_bounds[i]);
|
||||
expr_ref r = bind_variables(m_rule_fmls[i].get(), true);
|
||||
rules.push_back(r.get());
|
||||
// rules.push_back(m_rule_fmls[i].get());
|
||||
names.push_back(m_rule_names[i]);
|
||||
bounds.push_back(m_rule_bounds[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -47,6 +47,7 @@ Notes:
|
|||
#include "dl_boogie_proof.h"
|
||||
#include "qe_util.h"
|
||||
#include "scoped_proof.h"
|
||||
#include "expr_safe_replace.h"
|
||||
|
||||
namespace pdr {
|
||||
|
||||
|
@ -1062,10 +1063,7 @@ namespace pdr {
|
|||
predicates.pop_back();
|
||||
for (unsigned i = rule->get_uninterpreted_tail_size(); i < rule->get_tail_size(); ++i) {
|
||||
subst.apply(2, deltas, expr_offset(rule->get_tail(i), 1), tmp);
|
||||
dctx.get_rewriter()(tmp);
|
||||
if (!m.is_true(tmp)) {
|
||||
constraints.push_back(tmp);
|
||||
}
|
||||
constraints.push_back(tmp);
|
||||
}
|
||||
for (unsigned i = 0; i < constraints.size(); ++i) {
|
||||
max_var = std::max(vc.get_max_var(constraints[i].get()), max_var);
|
||||
|
@ -1088,7 +1086,28 @@ namespace pdr {
|
|||
|
||||
children.append(n->children());
|
||||
}
|
||||
return pm.mk_and(constraints);
|
||||
|
||||
expr_safe_replace repl(m);
|
||||
for (unsigned i = 0; i < constraints.size(); ++i) {
|
||||
expr* e = constraints[i].get(), *e1, *e2;
|
||||
if (m.is_eq(e, e1, e2) && is_var(e1) && is_ground(e2)) {
|
||||
repl.insert(e1, e2);
|
||||
}
|
||||
else if (m.is_eq(e, e1, e2) && is_var(e2) && is_ground(e1)) {
|
||||
repl.insert(e2, e1);
|
||||
}
|
||||
}
|
||||
expr_ref_vector result(m);
|
||||
for (unsigned i = 0; i < constraints.size(); ++i) {
|
||||
expr_ref tmp(m);
|
||||
tmp = constraints[i].get();
|
||||
repl(tmp);
|
||||
dctx.get_rewriter()(tmp);
|
||||
if (!m.is_true(tmp)) {
|
||||
result.push_back(tmp);
|
||||
}
|
||||
}
|
||||
return pm.mk_and(result);
|
||||
}
|
||||
|
||||
proof_ref model_search::get_proof_trace(context const& ctx) {
|
||||
|
@ -1221,6 +1240,7 @@ namespace pdr {
|
|||
remove_node(*m_root, false);
|
||||
dealloc(m_root);
|
||||
m_root = 0;
|
||||
m_cache.reset();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1254,7 +1274,7 @@ namespace pdr {
|
|||
m_pm(m_fparams, params.max_num_contexts(), m),
|
||||
m_query_pred(m),
|
||||
m_query(0),
|
||||
m_search(m_params.bfs_model_search(), m),
|
||||
m_search(m_params.bfs_model_search()),
|
||||
m_last_result(l_undef),
|
||||
m_inductive_lvl(0),
|
||||
m_expanded_lvl(0),
|
||||
|
|
|
@ -245,7 +245,6 @@ namespace pdr {
|
|||
|
||||
class model_search {
|
||||
typedef ptr_vector<model_node> model_nodes;
|
||||
ast_manager& m;
|
||||
bool m_bfs;
|
||||
model_node* m_root;
|
||||
std::deque<model_node*> m_leaves;
|
||||
|
@ -258,7 +257,7 @@ namespace pdr {
|
|||
void enqueue_leaf(model_node& n); // add leaf to priority queue.
|
||||
void update_models();
|
||||
public:
|
||||
model_search(bool bfs, ast_manager& m): m(m), m_bfs(bfs), m_root(0) {}
|
||||
model_search(bool bfs): m_bfs(bfs), m_root(0) {}
|
||||
~model_search();
|
||||
|
||||
void reset();
|
||||
|
|
|
@ -589,49 +589,8 @@ namespace datalog {
|
|||
dealloc = true;
|
||||
}
|
||||
|
||||
//enforce negative predicates
|
||||
unsigned ut_len=r->get_uninterpreted_tail_size();
|
||||
for(unsigned i=pt_len; i<ut_len; i++) {
|
||||
app * neg_tail = r->get_tail(i);
|
||||
func_decl * neg_pred = neg_tail->get_decl();
|
||||
variable_intersection neg_intersection(m_context.get_manager());
|
||||
neg_intersection.populate(single_res_expr, neg_tail);
|
||||
unsigned_vector t_cols(neg_intersection.size(), neg_intersection.get_cols1());
|
||||
unsigned_vector neg_cols(neg_intersection.size(), neg_intersection.get_cols2());
|
||||
|
||||
unsigned neg_len = neg_tail->get_num_args();
|
||||
for(unsigned i=0; i<neg_len; i++) {
|
||||
expr * e = neg_tail->get_arg(i);
|
||||
if(is_var(e)) {
|
||||
continue;
|
||||
}
|
||||
SASSERT(is_app(e));
|
||||
relation_sort arg_sort;
|
||||
m_context.get_rel_context()->get_rmanager().from_predicate(neg_pred, i, arg_sort);
|
||||
reg_idx new_reg;
|
||||
bool new_dealloc;
|
||||
make_add_constant_column(head_pred, filtered_res, arg_sort, to_app(e), new_reg, new_dealloc, acc);
|
||||
|
||||
if (dealloc)
|
||||
make_dealloc_non_void(filtered_res, acc);
|
||||
dealloc = new_dealloc;
|
||||
filtered_res = new_reg; // here filtered_res value gets changed !!
|
||||
|
||||
t_cols.push_back(single_res_expr.size());
|
||||
neg_cols.push_back(i);
|
||||
single_res_expr.push_back(e);
|
||||
}
|
||||
SASSERT(t_cols.size()==neg_cols.size());
|
||||
|
||||
reg_idx neg_reg = m_pred_regs.find(neg_pred);
|
||||
if (!dealloc)
|
||||
make_clone(filtered_res, filtered_res, acc);
|
||||
acc.push_back(instruction::mk_filter_by_negation(filtered_res, neg_reg, t_cols.size(),
|
||||
t_cols.c_ptr(), neg_cols.c_ptr()));
|
||||
dealloc = true;
|
||||
}
|
||||
|
||||
// enforce interpreted tail predicates
|
||||
unsigned ut_len = r->get_uninterpreted_tail_size();
|
||||
unsigned ft_len = r->get_tail_size(); // full tail
|
||||
ptr_vector<expr> tail;
|
||||
for (unsigned tail_index = ut_len; tail_index < ft_len; ++tail_index) {
|
||||
|
@ -738,6 +697,47 @@ namespace datalog {
|
|||
dealloc = true;
|
||||
}
|
||||
|
||||
//enforce negative predicates
|
||||
for (unsigned i = pt_len; i<ut_len; i++) {
|
||||
app * neg_tail = r->get_tail(i);
|
||||
func_decl * neg_pred = neg_tail->get_decl();
|
||||
variable_intersection neg_intersection(m_context.get_manager());
|
||||
neg_intersection.populate(single_res_expr, neg_tail);
|
||||
unsigned_vector t_cols(neg_intersection.size(), neg_intersection.get_cols1());
|
||||
unsigned_vector neg_cols(neg_intersection.size(), neg_intersection.get_cols2());
|
||||
|
||||
unsigned neg_len = neg_tail->get_num_args();
|
||||
for (unsigned i = 0; i<neg_len; i++) {
|
||||
expr * e = neg_tail->get_arg(i);
|
||||
if (is_var(e)) {
|
||||
continue;
|
||||
}
|
||||
SASSERT(is_app(e));
|
||||
relation_sort arg_sort;
|
||||
m_context.get_rel_context()->get_rmanager().from_predicate(neg_pred, i, arg_sort);
|
||||
reg_idx new_reg;
|
||||
bool new_dealloc;
|
||||
make_add_constant_column(head_pred, filtered_res, arg_sort, to_app(e), new_reg, new_dealloc, acc);
|
||||
|
||||
if (dealloc)
|
||||
make_dealloc_non_void(filtered_res, acc);
|
||||
dealloc = new_dealloc;
|
||||
filtered_res = new_reg; // here filtered_res value gets changed !!
|
||||
|
||||
t_cols.push_back(single_res_expr.size());
|
||||
neg_cols.push_back(i);
|
||||
single_res_expr.push_back(e);
|
||||
}
|
||||
SASSERT(t_cols.size() == neg_cols.size());
|
||||
|
||||
reg_idx neg_reg = m_pred_regs.find(neg_pred);
|
||||
if (!dealloc)
|
||||
make_clone(filtered_res, filtered_res, acc);
|
||||
acc.push_back(instruction::mk_filter_by_negation(filtered_res, neg_reg, t_cols.size(),
|
||||
t_cols.c_ptr(), neg_cols.c_ptr()));
|
||||
dealloc = true;
|
||||
}
|
||||
|
||||
#if 0
|
||||
// this version is potentially better for non-symbolic tables,
|
||||
// since it constraints each unbound column at a time (reducing the
|
||||
|
|
|
@ -62,8 +62,6 @@ namespace datalog {
|
|||
dealloc(m_elems);
|
||||
}
|
||||
|
||||
virtual bool can_swap() const { return true; }
|
||||
|
||||
virtual void swap(relation_base& other) {
|
||||
vector_relation& o = dynamic_cast<vector_relation&>(other);
|
||||
if (&o == this) return;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue