mirror of
https://github.com/Z3Prover/z3
synced 2025-04-23 09:05:31 +00:00
prepare polysat
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
commit
3f5df04dc4
252 changed files with 5792 additions and 2553 deletions
|
@ -178,7 +178,7 @@ namespace datalog {
|
|||
m_ctx.register_predicate(m_hnf.get_fresh_predicates()[i], false);
|
||||
}
|
||||
for (unsigned i = 0; i < fmls.size(); ++i) {
|
||||
mk_horn_rule(fmls[i].get(), prs[i].get(), rules, name);
|
||||
mk_horn_rule(fmls.get(i), prs.get(i), rules, name);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -190,12 +190,10 @@ namespace datalog {
|
|||
hoist_compound_predicates(index, m_head, m_body);
|
||||
TRACE("dl_rule",
|
||||
tout << mk_pp(m_head, m) << " :- ";
|
||||
for (unsigned i = 0; i < m_body.size(); ++i) {
|
||||
tout << mk_pp(m_body[i].get(), m) << " ";
|
||||
}
|
||||
for (expr* b : m_body)
|
||||
tout << mk_pp(b, m) << " ";
|
||||
tout << "\n";);
|
||||
|
||||
|
||||
mk_negations(m_body, m_neg);
|
||||
check_valid_rule(m_head, m_body.size(), m_body.data());
|
||||
|
||||
|
@ -241,9 +239,8 @@ namespace datalog {
|
|||
m_args.reset();
|
||||
head = ensure_app(e2);
|
||||
flatten_and(e1, m_args);
|
||||
for (unsigned i = 0; i < m_args.size(); ++i) {
|
||||
body.push_back(ensure_app(m_args[i].get()));
|
||||
}
|
||||
for (expr* a : m_args)
|
||||
body.push_back(ensure_app(a));
|
||||
}
|
||||
else {
|
||||
head = ensure_app(fml);
|
||||
|
@ -255,7 +252,7 @@ namespace datalog {
|
|||
unsigned sz = body.size();
|
||||
hoist_compound(index, head, body);
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
app_ref b(body[i].get(), m);
|
||||
app_ref b(body.get(i), m);
|
||||
hoist_compound(index, b, body);
|
||||
body[i] = b;
|
||||
}
|
||||
|
@ -781,7 +778,7 @@ namespace datalog {
|
|||
tail_neg.push_back(false);
|
||||
}
|
||||
|
||||
SASSERT(tail.size()==tail_neg.size());
|
||||
SASSERT(tail.size() == tail_neg.size());
|
||||
rule_ref old_r = r;
|
||||
r = mk(head, tail.size(), tail.data(), tail_neg.data(), old_r->name());
|
||||
r->set_accounting_parent_object(m_ctx, old_r);
|
||||
|
@ -949,7 +946,8 @@ namespace datalog {
|
|||
}
|
||||
|
||||
bool rule::has_negation() const {
|
||||
for (unsigned i = 0; i < get_uninterpreted_tail_size(); ++i) {
|
||||
unsigned sz = get_uninterpreted_tail_size();
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
if (is_neg_tail(i)) {
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -28,7 +28,7 @@ Revision History:
|
|||
#include "ast/rewriter/ast_counter.h"
|
||||
#include "ast/rewriter/rewriter.h"
|
||||
#include "muz/base/hnf.h"
|
||||
#include "qe/qe_lite.h"
|
||||
#include "qe/lite/qe_lite.h"
|
||||
#include "ast/rewriter/var_subst.h"
|
||||
#include "ast/datatype_decl_plugin.h"
|
||||
#include "ast/rewriter/label_rewriter.h"
|
||||
|
@ -287,13 +287,12 @@ namespace datalog {
|
|||
class rule : public accounted_object {
|
||||
friend class rule_manager;
|
||||
|
||||
app* m_head{ nullptr };
|
||||
proof* m_proof{ nullptr };
|
||||
unsigned m_tail_size:20;
|
||||
// unsigned m_reserve:12;
|
||||
unsigned m_ref_cnt{ 0 };
|
||||
unsigned m_positive_cnt{ 0 };
|
||||
unsigned m_uninterp_cnt{ 0 };
|
||||
app* m_head = nullptr;
|
||||
proof* m_proof = nullptr;
|
||||
unsigned m_tail_size = 0;
|
||||
unsigned m_ref_cnt = 0;
|
||||
unsigned m_positive_cnt = 0;
|
||||
unsigned m_uninterp_cnt = 0;
|
||||
symbol m_name;
|
||||
/**
|
||||
The following field is an array of tagged pointers.
|
||||
|
|
|
@ -204,6 +204,72 @@ void rule_properties::operator()(var* n) {
|
|||
void rule_properties::operator()(quantifier* n) {
|
||||
m_quantifiers.insert(n, m_rule);
|
||||
}
|
||||
|
||||
bool rule_properties::check_accessor(app* n) {
|
||||
sort* s = n->get_arg(0)->get_sort();
|
||||
SASSERT(m_dt.is_datatype(s));
|
||||
if (m_dt.get_datatype_constructors(s)->size() <= 1)
|
||||
return true;
|
||||
|
||||
|
||||
func_decl* f = n->get_decl();
|
||||
func_decl * c = m_dt.get_accessor_constructor(f);
|
||||
unsigned ut_size = m_rule->get_uninterpreted_tail_size();
|
||||
unsigned t_size = m_rule->get_tail_size();
|
||||
|
||||
auto is_recognizer_base = [&](expr* t) {
|
||||
return m_dt.is_recognizer(t) &&
|
||||
to_app(t)->get_arg(0) == n->get_arg(0) &&
|
||||
m_dt.get_recognizer_constructor(to_app(t)->get_decl()) == c;
|
||||
};
|
||||
|
||||
auto is_recognizer = [&](expr* t) {
|
||||
if (m.is_and(t))
|
||||
for (expr* arg : *to_app(t))
|
||||
if (is_recognizer_base(arg))
|
||||
return true;
|
||||
return is_recognizer_base(t);
|
||||
};
|
||||
|
||||
|
||||
for (unsigned i = ut_size; i < t_size; ++i)
|
||||
if (is_recognizer(m_rule->get_tail(i)))
|
||||
return true;
|
||||
|
||||
|
||||
// create parent use list for every sub-expression in the rule
|
||||
obj_map<expr, ptr_vector<expr>> use_list;
|
||||
for (unsigned i = ut_size; i < t_size; ++i) {
|
||||
app* t = m_rule->get_tail(i);
|
||||
use_list.insert_if_not_there(t, ptr_vector<expr>()).push_back(nullptr); // add marker for top-level expression.
|
||||
for (expr* sub : subterms::all(expr_ref(t, m)))
|
||||
if (is_app(sub))
|
||||
for (expr* arg : *to_app(sub))
|
||||
use_list.insert_if_not_there(arg, ptr_vector<expr>()).push_back(sub);
|
||||
}
|
||||
|
||||
// walk parents of n to check that each path is guarded by a recognizer.
|
||||
ptr_vector<expr> todo;
|
||||
todo.push_back(n);
|
||||
for (unsigned i = 0; i < todo.size(); ++i) {
|
||||
expr* e = todo[i];
|
||||
if (!use_list.contains(e))
|
||||
return false;
|
||||
for (expr* parent : use_list[e]) {
|
||||
if (!parent)
|
||||
return false; // top-level expressions are not guarded
|
||||
if (is_recognizer(parent))
|
||||
continue;
|
||||
if (m.is_ite(parent) && to_app(parent)->get_arg(1) == e && is_recognizer(to_app(parent)->get_arg(0)))
|
||||
continue;
|
||||
todo.push_back(parent);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
void rule_properties::operator()(app* n) {
|
||||
func_decl_ref f_out(m);
|
||||
expr* n1 = nullptr, *n2 = nullptr;
|
||||
|
@ -216,23 +282,9 @@ void rule_properties::operator()(app* n) {
|
|||
m_uninterp_funs.insert(f, m_rule);
|
||||
}
|
||||
else if (m_dt.is_accessor(n)) {
|
||||
sort* s = n->get_arg(0)->get_sort();
|
||||
SASSERT(m_dt.is_datatype(s));
|
||||
if (m_dt.get_datatype_constructors(s)->size() > 1) {
|
||||
bool found = false;
|
||||
func_decl * c = m_dt.get_accessor_constructor(f);
|
||||
unsigned ut_size = m_rule->get_uninterpreted_tail_size();
|
||||
unsigned t_size = m_rule->get_tail_size();
|
||||
for (unsigned i = ut_size; !found && i < t_size; ++i) {
|
||||
app* t = m_rule->get_tail(i);
|
||||
if (m_dt.is_recognizer(t) && t->get_arg(0) == n->get_arg(0) && m_dt.get_recognizer_constructor(t->get_decl()) == c) {
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
if (!found) {
|
||||
m_uninterp_funs.insert(f, m_rule);
|
||||
}
|
||||
}
|
||||
if (!check_accessor(n))
|
||||
m_uninterp_funs.insert(f, m_rule);
|
||||
|
||||
}
|
||||
else if (m_a.is_considered_uninterpreted(f, n->get_num_args(), n->get_args(), f_out)) {
|
||||
m_uninterp_funs.insert(f, m_rule);
|
||||
|
|
|
@ -44,7 +44,7 @@ namespace datalog {
|
|||
bool m_generate_proof;
|
||||
rule* m_rule;
|
||||
obj_map<quantifier, rule*> m_quantifiers;
|
||||
obj_map<func_decl, rule*> m_uninterp_funs;
|
||||
obj_map<func_decl, rule*> m_uninterp_funs;
|
||||
ptr_vector<rule> m_interp_pred;
|
||||
ptr_vector<rule> m_negative_rules;
|
||||
ptr_vector<rule> m_inf_sort;
|
||||
|
@ -55,6 +55,7 @@ namespace datalog {
|
|||
void check_sort(sort* s);
|
||||
void visit_rules(expr_sparse_mark& visited, rule_set const& rules);
|
||||
bool evaluates_to_numeral(expr * n, rational& val);
|
||||
bool check_accessor(app* n);
|
||||
public:
|
||||
rule_properties(ast_manager & m, rule_manager& rm, context& ctx, i_expr_pred& is_predicate);
|
||||
~rule_properties();
|
||||
|
|
|
@ -395,8 +395,8 @@ public:
|
|||
char const* name() const override { return "horn"; }
|
||||
|
||||
void updt_params(params_ref const & p) override {
|
||||
m_params = p;
|
||||
m_imp->updt_params(p);
|
||||
m_params.append(p);
|
||||
m_imp->updt_params(m_params);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -35,7 +35,7 @@ Notes:
|
|||
#include "ast/rewriter/expr_replacer.h"
|
||||
#include "model/model_smt2_pp.h"
|
||||
#include "ast/scoped_proof.h"
|
||||
#include "qe/qe_lite.h"
|
||||
#include "qe/lite/qe_lite.h"
|
||||
#include "muz/spacer/spacer_qe_project.h"
|
||||
#include "model/model_pp.h"
|
||||
#include "ast/rewriter/expr_safe_replace.h"
|
||||
|
|
|
@ -23,7 +23,7 @@ Copyright (c) 2017 Arie Gurfinkel
|
|||
#include "ast/rewriter/expr_replacer.h"
|
||||
#include "model/model_smt2_pp.h"
|
||||
#include "ast/scoped_proof.h"
|
||||
#include "qe/qe_lite.h"
|
||||
#include "qe/lite/qe_lite.h"
|
||||
#include "muz/spacer/spacer_qe_project.h"
|
||||
#include "model/model_pp.h"
|
||||
#include "ast/rewriter/expr_safe_replace.h"
|
||||
|
|
|
@ -36,7 +36,7 @@ Revision History:
|
|||
#include "model/model_pp.h"
|
||||
|
||||
#include "qe/qe.h"
|
||||
#include "qe/qe_lite.h"
|
||||
#include "qe/lite/qe_lite.h"
|
||||
|
||||
#include "muz/spacer/spacer_mev_array.h"
|
||||
#include "muz/spacer/spacer_qe_project.h"
|
||||
|
|
|
@ -52,7 +52,7 @@ Notes:
|
|||
#include "model/model_smt2_pp.h"
|
||||
#include "model/model_pp.h"
|
||||
|
||||
#include "qe/qe_lite.h"
|
||||
#include "qe/lite/qe_lite.h"
|
||||
#include "qe/qe_mbp.h"
|
||||
#include "qe/mbp/mbp_term_graph.h"
|
||||
#include "qe/mbp/mbp_plugin.h"
|
||||
|
|
|
@ -23,7 +23,7 @@ Revision History:
|
|||
#include "muz/base/dl_context.h"
|
||||
#include "muz/transforms/dl_mk_rule_inliner.h"
|
||||
#include "smt/smt_kernel.h"
|
||||
#include "qe/qe_lite.h"
|
||||
#include "qe/lite/qe_lite.h"
|
||||
#include "ast/rewriter/bool_rewriter.h"
|
||||
#include "ast/rewriter/th_rewriter.h"
|
||||
#include "ast/datatype_decl_plugin.h"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue