3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-05-14 11:14:43 +00:00

working on named assertions support

Signed-off-by: Leonardo de Moura <leonardo@microsoft.com>
This commit is contained in:
Leonardo de Moura 2012-11-02 08:28:34 -07:00
parent 230382d4c9
commit d545f187f8
10 changed files with 223 additions and 96 deletions

View file

@ -0,0 +1,96 @@
/*++
Copyright (c) 2012 Microsoft Corporation
Module Name:
solver_na2as.cpp
Abstract:
Solver that implements "named" assertions using assumptions (aka answer literals).
That is, a named assertion assert_expr(t, a) is mapped into
a implies t
and 'a' is used as an extra assumption for check_sat.
Author:
Leonardo (leonardo) 2012-11-02
Notes:
--*/
#include"solver_na2as.h"
solver_na2as::solver_na2as() {
m_manager = 0;
}
solver_na2as::~solver_na2as() {
reset();
}
void solver_na2as::assert_expr(expr * t, expr * a) {
SASSERT(m_manager != 0);
expr * new_t = m_manager->mk_implies(a, t);
m_manager->inc_ref(a);
m_assumptions.push_back(a);
assert_expr(new_t);
}
void solver_na2as::init(ast_manager & m, symbol const & logic) {
SASSERT(m_assumptions.empty());
m_manager = &m;
init_core(m, logic);
}
struct append_assumptions {
ptr_vector<expr> & m_assumptions;
unsigned m_old_sz;
append_assumptions(ptr_vector<expr> & _m_assumptions,
unsigned num_assumptions,
expr * const * assumptions):
m_assumptions(_m_assumptions) {
m_old_sz = m_assumptions.size();
m_assumptions.append(num_assumptions, assumptions);
}
~append_assumptions() {
m_assumptions.shrink(m_old_sz);
}
};
lbool solver_na2as::check_sat(unsigned num_assumptions, expr * const * assumptions) {
append_assumptions app(m_assumptions, num_assumptions, assumptions);
return check_sat_core(num_assumptions, assumptions);
}
void solver_na2as::push() {
m_scopes.push_back(m_assumptions.size());
push_core();
}
void solver_na2as::pop(unsigned n) {
pop_core(n);
unsigned lvl = m_scopes.size();
SASSERT(n <= lvl);
unsigned new_lvl = lvl - n;
restore_assumptions(m_scopes[new_lvl]);
m_scopes.shrink(new_lvl);
}
void solver_na2as::restore_assumptions(unsigned old_sz) {
SASSERT(m_manager);
for (unsigned i = old_sz; i < m_assumptions.size(); i++) {
m_manager->dec_ref(m_assumptions[i]);
}
m_assumptions.shrink(old_sz);
}
unsigned solver_na2as::get_scope_level() const {
return m_scopes.size();
}
void solver_na2as::reset() {
if (m_manager)
restore_assumptions(0);
}