mirror of
https://github.com/Z3Prover/z3
synced 2025-07-19 10:52:02 +00:00
Allow bool_ind_generalizer to skip non-array literals
Currently a hack to skip generalizing some literals. Used together with quic generalizer to remove all array terms if possible before quic generalization
This commit is contained in:
parent
46fb0d928a
commit
7dee36358d
2 changed files with 33 additions and 2 deletions
|
@ -24,8 +24,15 @@ Revision History:
|
||||||
#include "ast/expr_abstract.h"
|
#include "ast/expr_abstract.h"
|
||||||
#include "ast/rewriter/var_subst.h"
|
#include "ast/rewriter/var_subst.h"
|
||||||
#include "ast/for_each_expr.h"
|
#include "ast/for_each_expr.h"
|
||||||
|
|
||||||
#include "muz/spacer/spacer_term_graph.h"
|
#include "muz/spacer/spacer_term_graph.h"
|
||||||
|
|
||||||
|
#include "ast/rewriter/expr_safe_replace.h"
|
||||||
|
#include "ast/substitution/matcher.h"
|
||||||
|
|
||||||
|
#include "ast/expr_functors.h"
|
||||||
|
|
||||||
|
|
||||||
namespace spacer {
|
namespace spacer {
|
||||||
void lemma_sanity_checker::operator()(lemma_ref &lemma) {
|
void lemma_sanity_checker::operator()(lemma_ref &lemma) {
|
||||||
unsigned uses_level;
|
unsigned uses_level;
|
||||||
|
@ -36,6 +43,19 @@ void lemma_sanity_checker::operator()(lemma_ref &lemma) {
|
||||||
lemma->weakness()));
|
lemma->weakness()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace{
|
||||||
|
class contains_array_op_proc : public i_expr_pred {
|
||||||
|
ast_manager &m;
|
||||||
|
family_id m_array_fid;
|
||||||
|
public:
|
||||||
|
contains_array_op_proc(ast_manager &manager) :
|
||||||
|
m(manager), m_array_fid(m.mk_family_id("array"))
|
||||||
|
{}
|
||||||
|
virtual bool operator()(expr *e) {
|
||||||
|
return is_app(e) && to_app(e)->get_family_id() == m_array_fid;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// ------------------------
|
// ------------------------
|
||||||
// lemma_bool_inductive_generalizer
|
// lemma_bool_inductive_generalizer
|
||||||
|
@ -50,6 +70,9 @@ void lemma_bool_inductive_generalizer::operator()(lemma_ref &lemma) {
|
||||||
pred_transformer &pt = lemma->get_pob()->pt();
|
pred_transformer &pt = lemma->get_pob()->pt();
|
||||||
ast_manager &m = pt.get_ast_manager();
|
ast_manager &m = pt.get_ast_manager();
|
||||||
|
|
||||||
|
contains_array_op_proc has_array_op(m);
|
||||||
|
check_pred has_arrays(has_array_op, m);
|
||||||
|
|
||||||
expr_ref_vector cube(m);
|
expr_ref_vector cube(m);
|
||||||
cube.append(lemma->get_cube());
|
cube.append(lemma->get_cube());
|
||||||
|
|
||||||
|
@ -65,6 +88,11 @@ void lemma_bool_inductive_generalizer::operator()(lemma_ref &lemma) {
|
||||||
(!m_failure_limit || num_failures < m_failure_limit)) {
|
(!m_failure_limit || num_failures < m_failure_limit)) {
|
||||||
expr_ref lit(m);
|
expr_ref lit(m);
|
||||||
lit = cube.get(i);
|
lit = cube.get(i);
|
||||||
|
if (m_array_only && !has_arrays(lit)) {
|
||||||
|
processed.push_back(lit);
|
||||||
|
++i;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
cube[i] = true_expr;
|
cube[i] = true_expr;
|
||||||
if (cube.size() > 1 &&
|
if (cube.size() > 1 &&
|
||||||
pt.check_inductive(lemma->level(), cube, uses_level, weakness)) {
|
pt.check_inductive(lemma->level(), cube, uses_level, weakness)) {
|
||||||
|
|
|
@ -48,11 +48,14 @@ class lemma_bool_inductive_generalizer : public lemma_generalizer {
|
||||||
};
|
};
|
||||||
|
|
||||||
unsigned m_failure_limit;
|
unsigned m_failure_limit;
|
||||||
|
bool m_array_only;
|
||||||
stats m_st;
|
stats m_st;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
lemma_bool_inductive_generalizer(context& ctx, unsigned failure_limit) :
|
lemma_bool_inductive_generalizer(context& ctx, unsigned failure_limit,
|
||||||
lemma_generalizer(ctx), m_failure_limit(failure_limit) {}
|
bool array_only = false) :
|
||||||
|
lemma_generalizer(ctx), m_failure_limit(failure_limit),
|
||||||
|
m_array_only(array_only) {}
|
||||||
~lemma_bool_inductive_generalizer() override {}
|
~lemma_bool_inductive_generalizer() override {}
|
||||||
void operator()(lemma_ref &lemma) override;
|
void operator()(lemma_ref &lemma) override;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue