3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-15 21:38:44 +00:00

print certificate for #2202, enable CTL-C for API fix #2203

Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
Nikolaj Bjorner 2019-03-24 17:08:31 -07:00
parent 0a0b0a5cc0
commit 5c67c9d907
10 changed files with 38 additions and 16 deletions

View file

@ -24,6 +24,7 @@ Revision History:
#include "api/api_stats.h" #include "api/api_stats.h"
#include "muz/fp/datalog_parser.h" #include "muz/fp/datalog_parser.h"
#include "util/cancel_eh.h" #include "util/cancel_eh.h"
#include "util/scoped_ctrl_c.h"
#include "util/scoped_timer.h" #include "util/scoped_timer.h"
#include "muz/fp/dl_cmds.h" #include "muz/fp/dl_cmds.h"
#include "cmd_context/cmd_context.h" #include "cmd_context/cmd_context.h"
@ -280,11 +281,13 @@ extern "C" {
lbool r = l_undef; lbool r = l_undef;
unsigned timeout = to_fixedpoint(d)->m_params.get_uint("timeout", mk_c(c)->get_timeout()); unsigned timeout = to_fixedpoint(d)->m_params.get_uint("timeout", mk_c(c)->get_timeout());
unsigned rlimit = to_fixedpoint(d)->m_params.get_uint("rlimit", mk_c(c)->get_rlimit()); unsigned rlimit = to_fixedpoint(d)->m_params.get_uint("rlimit", mk_c(c)->get_rlimit());
bool use_ctrl_c = to_fixedpoint(d)->m_params.get_bool("ctrl_c", true);
{ {
scoped_rlimit _rlimit(mk_c(c)->m().limit(), rlimit); scoped_rlimit _rlimit(mk_c(c)->m().limit(), rlimit);
cancel_eh<reslimit> eh(mk_c(c)->m().limit()); cancel_eh<reslimit> eh(mk_c(c)->m().limit());
api::context::set_interruptable si(*(mk_c(c)), eh); api::context::set_interruptable si(*(mk_c(c)), eh);
scoped_timer timer(timeout, &eh); scoped_timer timer(timeout, &eh);
scoped_ctrl_c ctrlc(eh, false, use_ctrl_c);
try { try {
r = to_fixedpoint_ref(d)->ctx().query(to_expr(q)); r = to_fixedpoint_ref(d)->ctx().query(to_expr(q));
} }

View file

@ -18,6 +18,7 @@ Revision History:
#include<iostream> #include<iostream>
#include "util/cancel_eh.h" #include "util/cancel_eh.h"
#include "util/scoped_timer.h" #include "util/scoped_timer.h"
#include "util/scoped_ctrl_c.h"
#include "util/file_path.h" #include "util/file_path.h"
#include "parsers/smt2/smt2parser.h" #include "parsers/smt2/smt2parser.h"
#include "opt/opt_context.h" #include "opt/opt_context.h"
@ -148,8 +149,10 @@ extern "C" {
cancel_eh<reslimit> eh(mk_c(c)->m().limit()); cancel_eh<reslimit> eh(mk_c(c)->m().limit());
unsigned timeout = to_optimize_ptr(o)->get_params().get_uint("timeout", mk_c(c)->get_timeout()); unsigned timeout = to_optimize_ptr(o)->get_params().get_uint("timeout", mk_c(c)->get_timeout());
unsigned rlimit = to_optimize_ptr(o)->get_params().get_uint("rlimit", mk_c(c)->get_rlimit()); unsigned rlimit = to_optimize_ptr(o)->get_params().get_uint("rlimit", mk_c(c)->get_rlimit());
bool use_ctrl_c = to_optimize_ptr(o)->get_params().get_bool("ctrl_c", true);
api::context::set_interruptable si(*(mk_c(c)), eh); api::context::set_interruptable si(*(mk_c(c)), eh);
{ {
scoped_ctrl_c ctrlc(eh, false, use_ctrl_c);
scoped_timer timer(timeout, &eh); scoped_timer timer(timeout, &eh);
scoped_rlimit _rlimit(mk_c(c)->m().limit(), rlimit); scoped_rlimit _rlimit(mk_c(c)->m().limit(), rlimit);
try { try {

View file

@ -31,9 +31,6 @@ Revision History:
#include "api/api_stats.h" #include "api/api_stats.h"
#include "api/api_ast_vector.h" #include "api/api_ast_vector.h"
#include "solver/tactic2solver.h" #include "solver/tactic2solver.h"
#include "util/scoped_ctrl_c.h"
#include "util/cancel_eh.h"
#include "util/scoped_timer.h"
#include "util/file_path.h" #include "util/file_path.h"
#include "tactic/portfolio/smt_strategic_solver.h" #include "tactic/portfolio/smt_strategic_solver.h"
#include "smt/smt_solver.h" #include "smt/smt_solver.h"
@ -465,7 +462,7 @@ extern "C" {
expr * const * _assumptions = to_exprs(assumptions); expr * const * _assumptions = to_exprs(assumptions);
unsigned timeout = to_solver(s)->m_params.get_uint("timeout", mk_c(c)->get_timeout()); unsigned timeout = to_solver(s)->m_params.get_uint("timeout", mk_c(c)->get_timeout());
unsigned rlimit = to_solver(s)->m_params.get_uint("rlimit", mk_c(c)->get_rlimit()); unsigned rlimit = to_solver(s)->m_params.get_uint("rlimit", mk_c(c)->get_rlimit());
bool use_ctrl_c = to_solver(s)->m_params.get_bool("ctrl_c", false); bool use_ctrl_c = to_solver(s)->m_params.get_bool("ctrl_c", true);
cancel_eh<reslimit> eh(mk_c(c)->m().limit()); cancel_eh<reslimit> eh(mk_c(c)->m().limit());
api::context::set_interruptable si(*(mk_c(c)), eh); api::context::set_interruptable si(*(mk_c(c)), eh);
lbool result; lbool result;
@ -656,7 +653,7 @@ extern "C" {
lbool result = l_undef; lbool result = l_undef;
unsigned timeout = to_solver(s)->m_params.get_uint("timeout", mk_c(c)->get_timeout()); unsigned timeout = to_solver(s)->m_params.get_uint("timeout", mk_c(c)->get_timeout());
unsigned rlimit = to_solver(s)->m_params.get_uint("rlimit", mk_c(c)->get_rlimit()); unsigned rlimit = to_solver(s)->m_params.get_uint("rlimit", mk_c(c)->get_rlimit());
bool use_ctrl_c = to_solver(s)->m_params.get_bool("ctrl_c", false); bool use_ctrl_c = to_solver(s)->m_params.get_bool("ctrl_c", true);
cancel_eh<reslimit> eh(mk_c(c)->m().limit()); cancel_eh<reslimit> eh(mk_c(c)->m().limit());
api::context::set_interruptable si(*(mk_c(c)), eh); api::context::set_interruptable si(*(mk_c(c)), eh);
{ {
@ -698,7 +695,7 @@ extern "C" {
} }
unsigned timeout = to_solver(s)->m_params.get_uint("timeout", mk_c(c)->get_timeout()); unsigned timeout = to_solver(s)->m_params.get_uint("timeout", mk_c(c)->get_timeout());
unsigned rlimit = to_solver(s)->m_params.get_uint("rlimit", mk_c(c)->get_rlimit()); unsigned rlimit = to_solver(s)->m_params.get_uint("rlimit", mk_c(c)->get_rlimit());
bool use_ctrl_c = to_solver(s)->m_params.get_bool("ctrl_c", false); bool use_ctrl_c = to_solver(s)->m_params.get_bool("ctrl_c", true);
cancel_eh<reslimit> eh(mk_c(c)->m().limit()); cancel_eh<reslimit> eh(mk_c(c)->m().limit());
api::context::set_interruptable si(*(mk_c(c)), eh); api::context::set_interruptable si(*(mk_c(c)), eh);
{ {

View file

@ -730,6 +730,7 @@ namespace datalog {
void context::collect_params(param_descrs& p) { void context::collect_params(param_descrs& p) {
fp_params::collect_param_descrs(p); fp_params::collect_param_descrs(p);
insert_timeout(p); insert_timeout(p);
insert_ctrl_c(p);
} }
void context::updt_params(params_ref const& p) { void context::updt_params(params_ref const& p) {
@ -854,7 +855,11 @@ namespace datalog {
UNREACHABLE(); UNREACHABLE();
} }
ensure_engine(); ensure_engine();
return m_engine->query(query); lbool r = m_engine->query(query);
if (r != l_undef && get_params().print_certificate()) {
display_certificate(std::cout) << "\n";
}
return r;
} }
lbool context::query_from_lvl (expr* query, unsigned lvl) { lbool context::query_from_lvl (expr* query, unsigned lvl) {
@ -951,9 +956,10 @@ namespace datalog {
} }
} }
void context::display_certificate(std::ostream& out) { std::ostream& context::display_certificate(std::ostream& out) {
ensure_engine(); ensure_engine();
m_engine->display_certificate(out); m_engine->display_certificate(out);
return out;
} }
void context::display(std::ostream & out) const { void context::display(std::ostream & out) const {

View file

@ -581,7 +581,7 @@ namespace datalog {
/** /**
\brief Display a certificate for reachability and/or unreachability. \brief Display a certificate for reachability and/or unreachability.
*/ */
void display_certificate(std::ostream& out); std::ostream& display_certificate(std::ostream& out);
/** /**
\brief query result if it contains fact. \brief query result if it contains fact.

View file

@ -1487,6 +1487,8 @@ namespace opt {
void context::collect_param_descrs(param_descrs & r) { void context::collect_param_descrs(param_descrs & r) {
opt_params::collect_param_descrs(r); opt_params::collect_param_descrs(r);
insert_timeout(r);
insert_ctrl_c(r);
} }
void context::updt_params(params_ref const& p) { void context::updt_params(params_ref const& p) {

View file

@ -144,20 +144,30 @@ namespace sat {
DEBUG_CODE({ DEBUG_CODE({
// all clauses must be satisfied // all clauses must be satisfied
bool sat = false; bool sat = false;
for (literal l : it->m_clauses) { bool undef = false;
for (literal const& l : it->m_clauses) {
if (l == null_literal) { if (l == null_literal) {
CTRACE("sat", !sat, CTRACE("sat", !sat,
if (m_solver) m_solver->display(tout);
display(tout); display(tout);
for (unsigned v = 0; v < m.size(); ++v) tout << v << ": " << m[v] << "\n"; for (unsigned v = 0; v < m.size(); ++v) tout << v << ": " << m[v] << "\n";
for (literal const& l2 : it->m_clauses) {
if (l2 == null_literal) tout << "\n"; else tout << l2 << " ";
if (&l == &l2) break;
}
); );
SASSERT(sat); SASSERT(sat || undef);
sat = false; sat = false;
undef = false;
continue; continue;
} }
if (sat) if (sat)
continue; continue;
if (value_at(l, m) == l_true) switch (value_at(l, m)) {
sat = true; case l_undef: undef = true; break;
case l_true: sat = true; break;
default: break;
}
} }
}); });
} }

View file

@ -223,9 +223,6 @@ void solver::assert_expr(expr* f, expr* t) {
assert_expr_core2(fml, a); assert_expr_core2(fml, a);
} }
static void insert_ctrl_c(param_descrs & r) {
r.insert("ctrl_c", CPK_BOOL, "enable interrupts from ctrl-c", "false");
}
void solver::collect_param_descrs(param_descrs & r) { void solver::collect_param_descrs(param_descrs & r) {

View file

@ -305,6 +305,9 @@ void insert_rlimit(param_descrs & r) {
r.insert("rlimit", CPK_UINT, "default resource limit used for solvers. Unrestricted when set to 0.", "0"); r.insert("rlimit", CPK_UINT, "default resource limit used for solvers. Unrestricted when set to 0.", "0");
} }
void insert_ctrl_c(param_descrs & r) {
r.insert("ctrl_c", CPK_BOOL, "enable interrupts from ctrl-c", "true");
}
class params { class params {
friend class params_ref; friend class params_ref;

View file

@ -140,5 +140,6 @@ void insert_produce_models(param_descrs & r);
void insert_produce_proofs(param_descrs & r); void insert_produce_proofs(param_descrs & r);
void insert_timeout(param_descrs & r); void insert_timeout(param_descrs & r);
void insert_rlimit(param_descrs & r); void insert_rlimit(param_descrs & r);
void insert_ctrl_c(param_descrs & r);
#endif #endif