#pragma once
#include "ast/ast.h"
#include "util/params.h"
#include "math/ff/ff_polynomial.h"
#include <memory>
#include <set>
namespace ff {
bool check_boolean_tautology(ast_manager &m, expr *formula);
bool check_polynomial_rewrite(ast_manager& m, expr* formula);
class recorded_problem {
struct imp;
std::unique_ptr<imp> m_imp;
public:
recorded_problem(ast_manager &m, sort *field, engine &algebra,
expr_ref_vector const &premises);
~recorded_problem();
lbool check();
app *evidence() const;
rational value(expr *term);
};
app_ref record_refutation(ast_manager &m, expr_ref_vector const &premises, params_ref const ¶ms);
bool check_refutation(ast_manager &m, app *evidence);
std::set<unsigned> refutation_support(ast_manager &m, app *evidence);
expr_ref_vector refutation_clause(ast_manager &m, app *evidence);
proof_ref mk_refutation_lemma(ast_manager &m, expr *fact, app *evidence);
bool check_refutation_lemma(ast_manager &m, proof *lemma);
}