#pragma once
#include "ast/ff_decl_plugin.h"
#include "ast/rewriter/th_rewriter.h"
#include "math/ff/ff_polynomial.h"
#include <memory>
namespace ff {
class ff_encoding_cache {
struct imp;
std::unique_ptr<imp> m_imp;
friend class solver;
public:
ff_encoding_cache(ast_manager &m, sort *field);
~ff_encoding_cache();
unsigned size() const;
void reset();
};
class solver {
struct imp;
std::unique_ptr<imp> m_imp;
public:
solver(ast_manager &m, sort *field, params_ref const &p,
ff_encoding_cache *cache = nullptr, basis_cache *basis = nullptr);
~solver();
void add(expr *a, expr *b, bool equality);
lbool check();
rational value(expr *term);
expr *premise(unsigned index) const;
std::set<unsigned> const &conflict() const;
void collect_statistics(statistics &st) const;
bool encoding_limit_hit() const;
unsigned encoding_steps() const;
};
}