3
0
Fork 0
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:
Nikolaj Bjorner 2022-01-26 06:19:24 +01:00
commit 3f5df04dc4
252 changed files with 5792 additions and 2553 deletions

View file

@ -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;
}

View file

@ -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.

View file

@ -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);

View file

@ -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();

View file

@ -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);
}

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"

View file

@ -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"