mirror of
https://github.com/Z3Prover/z3
synced 2025-04-22 16:45:31 +00:00
improve clp solver
- run default rule transformations - sort a predicate's rules by number of queries in the body to bias search Signed-off-by: Nuno Lopes <t-nclaud@microsoft.com>
This commit is contained in:
parent
56dedec740
commit
dc91a754dd
1 changed files with 12 additions and 4 deletions
|
@ -66,9 +66,10 @@ namespace datalog {
|
|||
m_ctx.ensure_opened();
|
||||
m_solver.reset();
|
||||
m_goals.reset();
|
||||
rm.mk_query(query, m_ctx.get_rules());
|
||||
expr_ref head(m);
|
||||
head = m_ctx.get_rules().last()->get_head();
|
||||
func_decl *head_decl = rm.mk_query(query, m_ctx.get_rules());
|
||||
m_ctx.apply_default_transformation();
|
||||
|
||||
expr_ref head(m_ctx.get_rules().get_predicate_rules(head_decl)[0]->get_head(), m);
|
||||
ground(head);
|
||||
m_goals.push_back(to_app(head));
|
||||
return search(20, 0);
|
||||
|
@ -125,6 +126,10 @@ namespace datalog {
|
|||
m_var_subst(e, m_ground.size(), m_ground.c_ptr(), e);
|
||||
}
|
||||
|
||||
static bool rule_sort_fn(const rule *r1, const rule *r2) {
|
||||
return r1->get_uninterpreted_tail_size() < r2->get_uninterpreted_tail_size();
|
||||
}
|
||||
|
||||
lbool search(unsigned depth, unsigned index) {
|
||||
if (index == m_goals.size()) {
|
||||
return l_true;
|
||||
|
@ -135,7 +140,10 @@ namespace datalog {
|
|||
IF_VERBOSE(1, verbose_stream() << "search " << depth << " " << index << "\n";);
|
||||
unsigned num_goals = m_goals.size();
|
||||
app* head = m_goals[index].get();
|
||||
rule_vector const& rules = m_ctx.get_rules().get_predicate_rules(head->get_decl());
|
||||
|
||||
rule_vector rules(m_ctx.get_rules().get_predicate_rules(head->get_decl()));
|
||||
std::stable_sort(rules.begin(), rules.end(), rule_sort_fn);
|
||||
|
||||
lbool status = l_false;
|
||||
for (unsigned i = 0; i < rules.size(); ++i) {
|
||||
rule* r = rules[i];
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue