mirror of
https://github.com/Z3Prover/z3
synced 2025-04-08 18:31:49 +00:00
add core validation option to directly validate cores using the context
Signed-off-by: Nikolaj Bjorner <nbjorner@microsoft.com>
This commit is contained in:
parent
76ca64b93b
commit
db24cb8087
|
@ -35,6 +35,7 @@ void smt_params::updt_local_params(params_ref const & _p) {
|
|||
m_delay_units_threshold = p.delay_units_threshold();
|
||||
m_preprocess = _p.get_bool("preprocess", true); // hidden parameter
|
||||
m_timeout = p.timeout();
|
||||
m_core_validate = p.core_validate();
|
||||
model_params mp(_p);
|
||||
m_model_compact = mp.compact();
|
||||
if (_p.get_bool("arith.greatest_error_pivot", false))
|
||||
|
|
|
@ -195,6 +195,7 @@ struct smt_params : public preprocessor_params,
|
|||
//
|
||||
// -----------------------------------
|
||||
bool m_display_installed_theories;
|
||||
bool m_core_validate;
|
||||
|
||||
// -----------------------------------
|
||||
//
|
||||
|
@ -269,6 +270,7 @@ struct smt_params : public preprocessor_params,
|
|||
m_model_on_final_check(false),
|
||||
m_progress_sampling_freq(0),
|
||||
m_display_installed_theories(false),
|
||||
m_core_validate(false),
|
||||
m_preprocess(true), // temporary hack for disabling all preprocessing..
|
||||
m_user_theory_preprocess_axioms(false),
|
||||
m_user_theory_persist_axioms(false),
|
||||
|
|
|
@ -57,5 +57,6 @@ def_module_params(module_name='smt',
|
|||
('dack.factor', DOUBLE, 0.1, 'number of instance per conflict'),
|
||||
('dack.gc', UINT, 2000, 'Dynamic ackermannization garbage collection frequency (per conflict)'),
|
||||
('dack.gc_inv_decay', DOUBLE, 0.8, 'Dynamic ackermannization garbage collection decay'),
|
||||
('dack.threshold', UINT, 10, ' number of times the congruence rule must be used before Leibniz\'s axiom is expanded')
|
||||
('dack.threshold', UINT, 10, ' number of times the congruence rule must be used before Leibniz\'s axiom is expanded'),
|
||||
('core.validate', BOOL, False, 'validate unsat core produced by SMT context')
|
||||
))
|
||||
|
|
|
@ -2928,6 +2928,7 @@ namespace smt {
|
|||
for (unsigned i = 0; i < sz; i++) {
|
||||
tout << mk_pp(m_unsat_core.get(i), m_manager) << "\n";
|
||||
});
|
||||
validate_unsat_core();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1046,6 +1046,8 @@ namespace smt {
|
|||
|
||||
void mk_unsat_core();
|
||||
|
||||
void validate_unsat_core();
|
||||
|
||||
void init_search();
|
||||
|
||||
void end_search();
|
||||
|
|
|
@ -399,5 +399,33 @@ namespace smt {
|
|||
|
||||
#endif
|
||||
|
||||
/**
|
||||
\brief validate unsat core returned by
|
||||
*/
|
||||
void context::validate_unsat_core() {
|
||||
if (!get_fparams().m_core_validate) {
|
||||
return;
|
||||
}
|
||||
context ctx(get_manager(), get_fparams(), get_params());
|
||||
ptr_vector<expr> assertions;
|
||||
get_assertions(assertions);
|
||||
unsigned sz = assertions.size();
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
ctx.assert_expr(assertions[i]);
|
||||
}
|
||||
sz = m_unsat_core.size();
|
||||
for (unsigned i = 0; i < sz; ++i) {
|
||||
ctx.assert_expr(m_unsat_core.get(i));
|
||||
}
|
||||
lbool res = ctx.check();
|
||||
switch (res) {
|
||||
case l_false:
|
||||
break;
|
||||
default:
|
||||
UNREACHABLE();
|
||||
throw default_exception("Core could not be validated");
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in a new issue