mirror of
https://github.com/Z3Prover/z3
synced 2026-02-19 23:14:40 +00:00
revise axiom instantiation scheme for finite-sets
Instead of asserting theory axioms lazily we create them on the fly and allow propagation eagerly. The approach uses a waterfall model as follows: - terms are created: they are inserted into an index for (set.in x S) axiom creation. - two terms are merged by an equality. Loop over all new opportunities for axiom instantiation New axioms are added to a queue of recently created axioms. - an atomic formula was asserted by the SAT solver. Update the watch list to find new propagations. During propagation recently created axioms are either inserted into a propagation queue, or inserted into a watch list. They are inserted into a propagation queue all or all but one literal is assigned to false. They are inserted into a watch list if at least two literals are unassigned They are dropped if the axiom contains a literal that is assigned to true The propagation queue is processed by by asserting the theory axiom to the core. Also add some elementary statistics. A breaking change is to change the datatype for undo-trail in smt_context to not use a custom data-structure. This can likely cause regressions. For example, the region allocator now comes from the stack_trail instead of being owned within smt_context with a different declaration order. smt_context could crash during destruction or maybe even pop. We take the risk as the change is overdue. Add swap method to ref_vector.
This commit is contained in:
parent
aa1f1f56b6
commit
43d40ac142
7 changed files with 522 additions and 209 deletions
|
|
@ -266,6 +266,10 @@ public:
|
|||
SASSERT(&(this->m_manager) == &(other.m_manager));
|
||||
this->m_nodes.swap(other.m_nodes);
|
||||
}
|
||||
|
||||
void swap(unsigned idx1, unsigned idx2) noexcept {
|
||||
this->super::swap(idx1, idx2);
|
||||
}
|
||||
|
||||
class element_ref {
|
||||
T * & m_ref;
|
||||
|
|
|
|||
|
|
@ -423,4 +423,13 @@ public:
|
|||
m_scopes.shrink(new_lvl);
|
||||
m_region.pop_scope(num_scopes);
|
||||
}
|
||||
|
||||
unsigned size() const {
|
||||
return m_trail_stack.size();
|
||||
}
|
||||
|
||||
void shrink(unsigned new_size) {
|
||||
SASSERT(new_size <= m_trail_stack.size());
|
||||
m_trail_stack.shrink(new_size);
|
||||
}
|
||||
};
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue