#pragma once
#include <libsmtutil/SolverInterface.h>
#include <map>
#include <vector>
namespace solidity::smtutil
{
class CHCSolverInterface
{
public:
CHCSolverInterface(std::optional<unsigned> _queryTimeout = {}): m_queryTimeout(_queryTimeout) {}
virtual ~CHCSolverInterface() = default;
virtual void declareVariable(std::string const& _name, SortPointer const& _sort) = 0;
virtual void registerRelation(Expression const& _expr) = 0;
virtual void addRule(Expression const& _expr, std::string const& _name) = 0;
using CexNode = Expression;
struct CexGraph
{
std::map<unsigned, CexNode> nodes;
std::map<unsigned, std::vector<unsigned>> edges;
};
virtual std::tuple<CheckResult, Expression, CexGraph> query(
Expression const& _expr
) = 0;
protected:
std::optional<unsigned> m_queryTimeout;
};
}