mirror of
https://github.com/Z3Prover/z3
synced 2025-06-19 20:33:38 +00:00
Merge branch 'master' of https://github.com/Z3Prover/z3
This commit is contained in:
commit
83717a9c86
50 changed files with 1091 additions and 614 deletions
|
@ -163,12 +163,46 @@ extern "C" {
|
|||
to_solver_ref(s)->set_model_converter(ctx->get_model_converter());
|
||||
}
|
||||
|
||||
static void solver_from_dimacs_stream(Z3_context c, Z3_solver s, std::istream& is) {
|
||||
init_solver(c, s);
|
||||
ast_manager& m = to_solver_ref(s)->get_manager();
|
||||
std::stringstream err;
|
||||
sat::solver solver(to_solver_ref(s)->get_params(), m.limit());
|
||||
if (!parse_dimacs(is, err, solver)) {
|
||||
SET_ERROR_CODE(Z3_PARSER_ERROR, err.str().c_str());
|
||||
return;
|
||||
}
|
||||
sat2goal s2g;
|
||||
ref<sat2goal::mc> mc;
|
||||
atom2bool_var a2b(m);
|
||||
for (unsigned v = 0; v < solver.num_vars(); ++v) {
|
||||
a2b.insert(m.mk_const(symbol(v), m.mk_bool_sort()), v);
|
||||
}
|
||||
goal g(m);
|
||||
s2g(solver, a2b, to_solver_ref(s)->get_params(), g, mc);
|
||||
for (unsigned i = 0; i < g.size(); ++i) {
|
||||
to_solver_ref(s)->assert_expr(g.form(i));
|
||||
}
|
||||
}
|
||||
|
||||
// DIMACS files start with "p cnf" and number of variables/clauses.
|
||||
// This is not legal SMT syntax, so use the DIMACS parser.
|
||||
static bool is_dimacs_string(Z3_string c_str) {
|
||||
std::cout << c_str << "\n";
|
||||
return c_str[0] == 'p' && c_str[1] == ' ' && c_str[2] == 'c';
|
||||
}
|
||||
|
||||
void Z3_API Z3_solver_from_string(Z3_context c, Z3_solver s, Z3_string c_str) {
|
||||
Z3_TRY;
|
||||
LOG_Z3_solver_from_string(c, s, c_str);
|
||||
std::string str(c_str);
|
||||
std::istringstream is(str);
|
||||
solver_from_stream(c, s, is);
|
||||
if (is_dimacs_string(c_str)) {
|
||||
solver_from_dimacs_stream(c, s, is);
|
||||
}
|
||||
else {
|
||||
solver_from_stream(c, s, is);
|
||||
}
|
||||
Z3_CATCH;
|
||||
}
|
||||
|
||||
|
@ -182,24 +216,7 @@ extern "C" {
|
|||
SET_ERROR_CODE(Z3_FILE_ACCESS_ERROR, nullptr);
|
||||
}
|
||||
else if (ext && (std::string("dimacs") == ext || std::string("cnf") == ext)) {
|
||||
ast_manager& m = to_solver_ref(s)->get_manager();
|
||||
std::stringstream err;
|
||||
sat::solver solver(to_solver_ref(s)->get_params(), m.limit());
|
||||
if (!parse_dimacs(is, err, solver)) {
|
||||
SET_ERROR_CODE(Z3_PARSER_ERROR, err.str().c_str());
|
||||
return;
|
||||
}
|
||||
sat2goal s2g;
|
||||
ref<sat2goal::mc> mc;
|
||||
atom2bool_var a2b(m);
|
||||
for (unsigned v = 0; v < solver.num_vars(); ++v) {
|
||||
a2b.insert(m.mk_const(symbol(v), m.mk_bool_sort()), v);
|
||||
}
|
||||
goal g(m);
|
||||
s2g(solver, a2b, to_solver_ref(s)->get_params(), g, mc);
|
||||
for (unsigned i = 0; i < g.size(); ++i) {
|
||||
to_solver_ref(s)->assert_expr(g.form(i));
|
||||
}
|
||||
solver_from_dimacs_stream(c, s, is);
|
||||
}
|
||||
else {
|
||||
solver_from_stream(c, s, is);
|
||||
|
@ -532,6 +549,17 @@ extern "C" {
|
|||
Z3_CATCH_RETURN("");
|
||||
}
|
||||
|
||||
Z3_string Z3_API Z3_solver_to_dimacs_string(Z3_context c, Z3_solver s) {
|
||||
Z3_TRY;
|
||||
LOG_Z3_solver_to_string(c, s);
|
||||
RESET_ERROR_CODE();
|
||||
init_solver(c, s);
|
||||
std::ostringstream buffer;
|
||||
to_solver_ref(s)->display_dimacs(buffer);
|
||||
return mk_c(c)->mk_external_string(buffer.str());
|
||||
Z3_CATCH_RETURN("");
|
||||
}
|
||||
|
||||
|
||||
Z3_lbool Z3_API Z3_get_implied_equalities(Z3_context c,
|
||||
Z3_solver s,
|
||||
|
|
|
@ -518,6 +518,12 @@ namespace z3 {
|
|||
sort(context & c, Z3_ast a):ast(c, a) {}
|
||||
sort(sort const & s):ast(s) {}
|
||||
operator Z3_sort() const { return reinterpret_cast<Z3_sort>(m_ast); }
|
||||
|
||||
/**
|
||||
\brief retrieve unique identifier for func_decl.
|
||||
*/
|
||||
unsigned id() const { unsigned r = Z3_get_sort_id(ctx(), *this); check_error(); return r; }
|
||||
|
||||
/**
|
||||
\brief Return true if this sort and \c s are equal.
|
||||
*/
|
||||
|
@ -615,6 +621,11 @@ namespace z3 {
|
|||
operator Z3_func_decl() const { return reinterpret_cast<Z3_func_decl>(m_ast); }
|
||||
func_decl & operator=(func_decl const & s) { return static_cast<func_decl&>(ast::operator=(s)); }
|
||||
|
||||
/**
|
||||
\brief retrieve unique identifier for func_decl.
|
||||
*/
|
||||
unsigned id() const { unsigned r = Z3_get_func_decl_id(ctx(), *this); check_error(); return r; }
|
||||
|
||||
unsigned arity() const { return Z3_get_arity(ctx(), *this); }
|
||||
sort domain(unsigned i) const { assert(i < arity()); Z3_sort r = Z3_get_domain(ctx(), *this, i); check_error(); return sort(ctx(), r); }
|
||||
sort range() const { Z3_sort r = Z3_get_range(ctx(), *this); check_error(); return sort(ctx(), r); }
|
||||
|
@ -771,6 +782,11 @@ namespace z3 {
|
|||
return std::string(Z3_get_numeral_decimal_string(ctx(), m_ast, precision));
|
||||
}
|
||||
|
||||
/**
|
||||
\brief retrieve unique identifier for expression.
|
||||
*/
|
||||
unsigned id() const { unsigned r = Z3_get_ast_id(ctx(), m_ast); check_error(); return r; }
|
||||
|
||||
/**
|
||||
\brief Return int value of numeral, throw if result cannot fit in
|
||||
machine int
|
||||
|
@ -2240,6 +2256,8 @@ namespace z3 {
|
|||
fml));
|
||||
}
|
||||
|
||||
std::string dimacs() const { return std::string(Z3_solver_to_dimacs_string(ctx(), m_solver)); }
|
||||
|
||||
param_descrs get_param_descrs() { return param_descrs(ctx(), Z3_solver_get_param_descrs(ctx(), m_solver)); }
|
||||
|
||||
|
||||
|
|
|
@ -6800,6 +6800,10 @@ class Solver(Z3PPObject):
|
|||
"""
|
||||
return Z3_solver_to_string(self.ctx.ref(), self.solver)
|
||||
|
||||
def dimacs(self):
|
||||
"""Return a textual representation of the solver in DIMACS format."""
|
||||
return Z3_solver_to_dimacs_string(self.ctx.ref(), self.solver)
|
||||
|
||||
def to_smt2(self):
|
||||
"""return SMTLIB2 formatted benchmark for solver's assertions"""
|
||||
es = self.assertions()
|
||||
|
|
|
@ -6368,6 +6368,14 @@ extern "C" {
|
|||
*/
|
||||
Z3_string Z3_API Z3_solver_to_string(Z3_context c, Z3_solver s);
|
||||
|
||||
/**
|
||||
\brief Convert a solver into a DIMACS formatted string.
|
||||
\sa Z3_goal_to_diamcs_string for requirements.
|
||||
|
||||
def_API('Z3_solver_to_dimacs_string', STRING, (_in(CONTEXT), _in(SOLVER)))
|
||||
*/
|
||||
Z3_string Z3_API Z3_solver_to_dimacs_string(Z3_context c, Z3_solver s);
|
||||
|
||||
/*@}*/
|
||||
|
||||
/** @name Statistics */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue