#pragma once
#include "tactic/goal.h"
#include "sat/sat_solver_core.h"
#include "sat/smt/atom2bool_var.h"
#include "sat/smt/sat_internalizer.h"
namespace euf {
class solver;
}
class goal2sat {
public:
typedef obj_map<expr, sat::literal> dep2asm_map;
private:
struct imp;
imp * m_imp;
unsigned m_scopes = 0;
public:
goal2sat();
~goal2sat();
static void collect_param_descrs(param_descrs & r);
static bool has_unsupported_bool(goal const & s);
void operator()(goal const & g, params_ref const & p, sat::solver_core & t, atom2bool_var & m, dep2asm_map& dep2asm, bool default_external = false);
void operator()(unsigned n, expr* const* fmls);
void init(ast_manager& m, params_ref const & p, sat::solver_core & t, atom2bool_var & map, dep2asm_map& dep2asm, bool default_external);
void assumptions(unsigned n, expr* const* fmls);
sat::literal internalize(expr* a);
void get_interpreted_funs(func_decl_ref_vector& funs);
bool has_interpreted_funs() const;
bool has_euf() const;
sat::sat_internalizer& si(ast_manager& m, params_ref const& p, sat::solver_core& t, atom2bool_var& a2b, dep2asm_map& dep2asm, bool default_external = false);
void update_model(model_ref& mdl);
void user_push();
void user_pop(unsigned n);
euf::solver* ensure_euf();
};