mirror of
https://github.com/Z3Prover/z3
synced 2025-06-08 23:23:23 +00:00
add solver_from_string to APIs
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
70b344513a
commit
46a96127be
5 changed files with 69 additions and 25 deletions
|
@ -128,30 +128,7 @@ extern "C" {
|
||||||
Z3_CATCH_RETURN(0);
|
Z3_CATCH_RETURN(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Z3_API Z3_solver_from_file(Z3_context c, Z3_solver s, Z3_string file_name) {
|
void solver_from_stream(Z3_context c, Z3_solver s, std::istream& is) {
|
||||||
Z3_TRY;
|
|
||||||
LOG_Z3_solver_from_file(c, s, file_name);
|
|
||||||
char const* ext = get_extension(file_name);
|
|
||||||
std::ifstream is(file_name);
|
|
||||||
if (!is) {
|
|
||||||
SET_ERROR_CODE(Z3_FILE_ACCESS_ERROR);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (ext && std::string("dimacs") == ext) {
|
|
||||||
ast_manager& m = to_solver_ref(s)->get_manager();
|
|
||||||
sat::solver solver(to_solver_ref(s)->get_params(), m.limit());
|
|
||||||
parse_dimacs(is, solver);
|
|
||||||
sat2goal s2g;
|
|
||||||
model_converter_ref mc;
|
|
||||||
atom2bool_var a2b(m);
|
|
||||||
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));
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
scoped_ptr<cmd_context> ctx = alloc(cmd_context, false, &(mk_c(c)->m()));
|
scoped_ptr<cmd_context> ctx = alloc(cmd_context, false, &(mk_c(c)->m()));
|
||||||
ctx->set_ignore_check(true);
|
ctx->set_ignore_check(true);
|
||||||
|
|
||||||
|
@ -170,6 +147,41 @@ extern "C" {
|
||||||
to_solver_ref(s)->assert_expr(*it);
|
to_solver_ref(s)->assert_expr(*it);
|
||||||
}
|
}
|
||||||
to_solver_ref(s)->set_model_converter(ctx->get_model_converter());
|
to_solver_ref(s)->set_model_converter(ctx->get_model_converter());
|
||||||
|
}
|
||||||
|
|
||||||
|
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);
|
||||||
|
Z3_CATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Z3_API Z3_solver_from_file(Z3_context c, Z3_solver s, Z3_string file_name) {
|
||||||
|
Z3_TRY;
|
||||||
|
LOG_Z3_solver_from_file(c, s, file_name);
|
||||||
|
char const* ext = get_extension(file_name);
|
||||||
|
std::ifstream is(file_name);
|
||||||
|
if (!is) {
|
||||||
|
SET_ERROR_CODE(Z3_FILE_ACCESS_ERROR);
|
||||||
|
}
|
||||||
|
else if (ext && std::string("dimacs") == ext) {
|
||||||
|
ast_manager& m = to_solver_ref(s)->get_manager();
|
||||||
|
sat::solver solver(to_solver_ref(s)->get_params(), m.limit());
|
||||||
|
parse_dimacs(is, solver);
|
||||||
|
sat2goal s2g;
|
||||||
|
model_converter_ref mc;
|
||||||
|
atom2bool_var a2b(m);
|
||||||
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
solver_from_stream(c, s, is);
|
||||||
|
}
|
||||||
Z3_CATCH;
|
Z3_CATCH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -231,6 +231,14 @@ namespace Microsoft.Z3
|
||||||
Native.Z3_solver_from_file(Context.nCtx, NativeObject, file);
|
Native.Z3_solver_from_file(Context.nCtx, NativeObject, file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Load solver assertions from a string.
|
||||||
|
/// </summary>
|
||||||
|
public void FromString(string str)
|
||||||
|
{
|
||||||
|
Native.Z3_solver_from_string(Context.nCtx, NativeObject, str);
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Assert a lemma (or multiple) into the solver.
|
/// Assert a lemma (or multiple) into the solver.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -170,6 +170,23 @@ public class Solver extends Z3Object {
|
||||||
constraint.getNativeObject(), p.getNativeObject());
|
constraint.getNativeObject(), p.getNativeObject());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Load solver assertions from a file.
|
||||||
|
/// </summary>
|
||||||
|
public void FromFile(string file)
|
||||||
|
{
|
||||||
|
Native.Z3_solver_from_file(Context.nCtx, NativeObject, file);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Load solver assertions from a string.
|
||||||
|
/// </summary>
|
||||||
|
public void FromString(string str)
|
||||||
|
{
|
||||||
|
Native.Z3_solver_from_string(Context.nCtx, NativeObject, str);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The number of assertions in the solver.
|
* The number of assertions in the solver.
|
||||||
*
|
*
|
||||||
|
|
|
@ -6335,7 +6335,7 @@ class Solver(Z3PPObject):
|
||||||
|
|
||||||
def from_string(self, s):
|
def from_string(self, s):
|
||||||
"""Parse assertions from a string"""
|
"""Parse assertions from a string"""
|
||||||
self.add([f for f in parse_smt2_string(s, ctx=self.ctx)])
|
Z3_solver_from_string(self.ctx.ref(), self.solver, filename)
|
||||||
|
|
||||||
def assertions(self):
|
def assertions(self):
|
||||||
"""Return an AST vector containing all added constraints.
|
"""Return an AST vector containing all added constraints.
|
||||||
|
|
|
@ -6152,6 +6152,13 @@ extern "C" {
|
||||||
*/
|
*/
|
||||||
void Z3_API Z3_solver_from_file(Z3_context c, Z3_solver s, Z3_string file_name);
|
void Z3_API Z3_solver_from_file(Z3_context c, Z3_solver s, Z3_string file_name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
\brief load solver assertions from a string.
|
||||||
|
|
||||||
|
def_API('Z3_solver_from_string', VOID, (_in(CONTEXT), _in(SOLVER), _in(STRING)))
|
||||||
|
*/
|
||||||
|
void Z3_API Z3_solver_from_string(Z3_context c, Z3_solver s, Z3_string file_name);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
\brief Return the set of asserted formulas on the solver.
|
\brief Return the set of asserted formulas on the solver.
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue