#pragma once
#include "ast/ast.h"
#include "ast/rewriter/seq_rewriter.h"
#include "util/lbool.h"
#include "util/vector.h"
namespace seq {
struct view {
expr_ref m_state;
expr_ref m_target;
struct sig {
unsigned state, target;
};
view(ast_manager& m) : m_state(m), m_target(m) {}
view(expr* state, expr* target, ast_manager& m) :
m_state(state, m), m_target(target, m) {}
static view membership(expr* state, ast_manager& m) {
return view(state, nullptr, m);
}
static view reach(expr* state, expr* target, ast_manager& m) {
return view(state, target, m);
}
bool is_membership() const { return m_target.get() == nullptr; }
bool is_reach() const { return m_target.get() != nullptr; }
sig key() const {
return { m_state ? m_state->get_id() : UINT_MAX,
m_target ? m_target->get_id() : UINT_MAX };
}
bool operator==(view const& other) const {
return m_state.get() == other.m_state.get() && m_target.get() == other.m_target.get();
}
bool operator!=(view const& other) const { return !(*this == other); }
};
inline bool operator<(view::sig const& a, view::sig const& b) {
if (a.state != b.state) return a.state < b.state;
return a.target < b.target;
}
inline bool operator==(view::sig const& a, view::sig const& b) {
return a.state == b.state && a.target == b.target;
}
using view_vector = vector<view>;
lbool accepts(view const& v, seq_rewriter& rw);
bool is_dead(view const& v, seq_rewriter& rw);
}