#pragma once
#include "ast/arith_decl_plugin.h"
#include "ast/array_decl_plugin.h"
#include "ast/ast.h"
#include "ast/ast_pp.h"
#include "ast/ast_util.h"
#include "ast/bv_decl_plugin.h"
#include "ast/expr_map.h"
#include "model/model.h"
#include "util/obj_hashtable.h"
#include "util/ref_vector.h"
#include "util/trace.h"
#include "util/vector.h"
#include "muz/spacer/spacer_antiunify.h"
#include "util/stopwatch.h"
class model;
class model_core;
namespace spacer {
inline unsigned infty_level() { return UINT_MAX; }
inline bool is_infty_level(unsigned lvl) {
return lvl >= 65535;
}
inline unsigned next_level(unsigned lvl) {
return is_infty_level(lvl) ? lvl : (lvl + 1);
}
inline unsigned prev_level(unsigned lvl) {
if (is_infty_level(lvl)) return infty_level();
if (lvl == 0) return 0;
return lvl - 1;
}
struct pp_level {
unsigned m_level;
pp_level(unsigned l) : m_level(l) {}
};
inline std::ostream &operator<<(std::ostream &out, pp_level const &p) {
if (is_infty_level(p.m_level)) {
return out << "oo";
} else {
return out << p.m_level;
}
}
typedef ptr_vector<app> app_vector;
typedef ptr_vector<func_decl> decl_vector;
typedef obj_hashtable<func_decl> func_decl_set;
void to_mbp_benchmark(std::ostream &out, const expr *fml,
const app_ref_vector &vars);
void qe_project(ast_manager &m, app_ref_vector &vars, expr_ref &fml, model &mdl,
bool reduce_all_selects = false, bool native_mbp = false,
bool dont_sub = false);
void qe_project(ast_manager &m, app_ref_vector &vars, expr_ref &fml,
model_ref &M, expr_map &map);
void expand_literals(ast_manager &m, expr_ref_vector &conjs);
expr_ref_vector compute_implicant_literals(model &mdl,
expr_ref_vector &formula);
void simplify_bounds(expr_ref_vector &lemmas);
bool is_normalized(expr_ref e, bool use_simplify_bounds = true,
bool factor_eqs = false);
void normalize(expr *e, expr_ref &out, bool use_simplify_bounds = true,
bool factor_eqs = false);
void normalize_order(expr *e, expr_ref &out);
void ground_expr(expr *e, expr_ref &out, app_ref_vector &vars);
void mbqi_project(model &mdl, app_ref_vector &vars, expr_ref &fml);
bool contains_selects(expr *fml, ast_manager &m);
bool contains_defaults(expr *fml, ast_manager &m);
void get_select_indices(expr *fml, app_ref_vector &indices);
void find_decls(expr *fml, app_ref_vector &decls, std::string &prefix);
struct mk_epp : public mk_pp {
params_ref m_epp_params;
expr_ref m_epp_expr;
mk_epp(ast *t, ast_manager &m, unsigned indent = 0, unsigned num_vars = 0,
char const *var_prefix = nullptr);
void rw(expr *e, expr_ref &out);
};
bool is_clause(ast_manager &m, expr *n);
bool is_literal(ast_manager &m, expr *n);
bool is_atom(ast_manager &m, expr *n);
void set_true_in_mdl(model &model, func_decl *f);
unsigned get_num_vars(expr *e);
void collect_uninterp_consts(expr *a, expr_ref_vector &out);
bool has_nonlinear_mul(expr *e, ast_manager &m);
bool has_nonlinear_var_mul(expr *e, ast_manager &m);
bool is_mono_var(expr *lit, ast_manager &m, arith_util &a_util);
bool find_unique_mono_var_lit(const expr_ref &p, expr_ref &lit);
bool filter_out_lit(const expr_ref_vector &in, const expr_ref &lit,
expr_ref_vector &out);
bool is_numeric_sub(const substitution &s);
bool contains_mod(const expr_ref &e);
bool contains_real(const expr_ref &e);
void mul_by_rat(expr_ref &fml, rational num);
}