14#ifndef MCRL2_PBES_DETAIL_BQNF_QUANTIFIER_REWRITER_H
15#define MCRL2_PBES_DETAIL_BQNF_QUANTIFIER_REWRITER_H
17#include "mcrl2/pbes/detail/bqnf_visitor.h"
36 assert(is_simple_expression(e,
false));
40 std::vector<data::variable> intersection;
41 for (
const data::variable& var: pbes_system::find_free_variables(e))
43 if (d.find(var) != d.end())
45 intersection.push_back(var);
48 if (intersection.empty())
61 if (l==empty && r==empty)
98 std::clog <<
"filter: Unexpected expression: " << pp(e) << std::endl;
99 throw(std::runtime_error(
"filter: Unexpected expression."));
117 data::variable_list free_g = free_variables(g);
118 std::set<data::variable> free_phi_i;
119 for (
const data::variable& v: pbes_system::find_free_variables(phi_i))
121 free_phi_i.insert(v);
123 std::set<data::variable> free_g_minus_free_phi_i;
124 for (
const data::variable& var: free_g)
126 if (free_phi_i.find(var)==free_phi_i.end()) {
127 free_g_minus_free_phi_i.insert(var);
130 std::vector<data::variable> d_intersects_free_g_minus_free_phi_i;
131 std::set<data::variable> d_minus_free_phi_i;
132 std::set<data::variable> d_intersects_free_phi_i;
133 for (
const data::variable& var: d)
135 if (free_g_minus_free_phi_i.find(var) != free_g_minus_free_phi_i.end())
137 d_intersects_free_g_minus_free_phi_i.push_back(var);
139 if (free_phi_i.find(var) != free_phi_i.end())
141 d_intersects_free_phi_i.insert(var);
145 d_minus_free_phi_i.insert(var);
150 if (!d_intersects_free_g_minus_free_phi_i.empty())
155 data::variable_list(d_intersects_free_g_minus_free_phi_i.begin(), d_intersects_free_g_minus_free_phi_i.end()),
195 data::variable_list qvars = quantifier_variables(e);
198 qvars = qvars + quantifier_variables(qexpr);
212 if (is_simple_expression(l,
false)) {
220 }
else if (!qvars.empty() || !(is_or(qexpr) ? is_true(phi) : is_false(phi))) {
222 std::vector<pbes_expression> conjuncts;
224 conjuncts = split_conjuncts(psi);
226 conjuncts.push_back(psi);
229 for (
auto phi_i: conjuncts)
231 pbes_expression r = rewrite_bqnf_expression(phi_i);
234 phi = filter_guard(phi, r, qvars);
238 if (!is_false(phi)) {
239 phi = filter_guard(phi, r, qvars);
243 std::vector<data::variable> qvars_i;
244 std::set<data::variable> free_phi_i;
245 for (
const data::variable& v : pbes_system::find_free_variables(phi_i))
247 free_phi_i.insert(v);
249 for (
const data::variable& var: qvars)
251 if (free_phi_i.find(var) != free_phi_i.end())
253 qvars_i.push_back(var);
257 if (!qvars_i.empty()) {
258 r = optimized_forall(data::variable_list(qvars_i.begin(), qvars_i.end()), r);
260 if (is_true(conjunction)) {
263 conjunction = and_(conjunction, r);
266 result
= conjunction;
270 throw(std::runtime_error(
"rewrite_bounded_forall: unexpected qexpr."));
286 data::variable_list qvars = quantifier_variables(e);
288 qvars = qvars + quantifier_variables(qexpr);
304 std::vector<pbes_equation> new_eqns;
305 std::vector<pbes_expression> conjuncts = split_conjuncts(e);
306 for (
auto expr: conjuncts)
308 pbes_expression r = rewrite_bqnf_expression(expr);
309 if (is_true(conjunction)) {
312 conjunction = and_(conjunction, r);
326 std::vector<pbes_expression> new_exprs;
327 std::vector<pbes_expression> disjuncts = split_disjuncts(e);
328 for (
auto expr: disjuncts)
330 pbes_expression r = rewrite_bqnf_expression(expr);
331 if (is_false(disjunction)) {
334 disjunction = or_(disjunction, r);
382 std::clog <<
"Unexpected expression: " << pp(e) << std::endl;
383 throw(std::runtime_error(
"Unexpected expression."));
\brief The and operator for pbes expressions
and_(const pbes_expression &left, const pbes_expression &right)
\brief Constructor Z14.
\brief The implication operator for pbes expressions
imp(const pbes_expression &left, const pbes_expression &right)
\brief Constructor Z14.
\brief The not operator for pbes expressions
not_(const pbes_expression &operand)
\brief Constructor Z14.
\brief The or operator for pbes expressions
or_(const pbes_expression &left, const pbes_expression &right)
\brief Constructor Z14.
pbes_expression & operator=(pbes_expression &&) noexcept=default
pbes_expression & operator=(const pbes_expression &) noexcept=default
The namespace for accessor functions on pbes expressions.
const pbes_expression & arg(const pbes_expression &t)
Returns the pbes expression argument of expressions of type not, exists and forall.
const pbes_expression & left(const pbes_expression &t)
Returns the left hand side of an expression of type and, or or imp.
const pbes_expression & right(const pbes_expression &t)
Returns the right hand side of an expression of type and, or or imp.
bool is_data(const pbes_expression &t)
Returns true if the term t is a data expression.
const pbes_expression & true_()
bool is_exists(const atermpp::aterm &x)
bool is_or(const atermpp::aterm &x)
bool is_forall(const atermpp::aterm &x)
bool is_propositional_variable_instantiation(const atermpp::aterm &x)
bool is_and(const atermpp::aterm &x)
bool is_imp(const atermpp::aterm &x)
const pbes_expression & false_()
virtual pbes_expression filter_guard(const pbes_expression &g, const pbes_expression &phi_i, const data::variable_list &d)
Filters a 'guard' g with respect to a set of variables d and an expression phi_i such that parts of g...
virtual pbes_expression rewrite_bqnf_expression(const pbes_expression &e)
Rewrites a BQNF expression. Replaces universal quantifier over conjuncts with conjuncts over universa...
virtual pbes_expression rewrite_bounded_forall(const pbes_expression &e)
Rewrites a bounded universal quantifier expression. If the subexpression is a conjunction,...
virtual pbes_expression rewrite_and(const pbes_expression &e)
Rewrites a conjunctive expression. rewrite_imp(/_i phi_i) = /_i rewrite_bqnf_expression(phi_i).
virtual pbes_expression rewrite_imp(const pbes_expression &e)
Rewrites an implication: rewrite_imp(phi => psi) = rewrite_bqnf_expression(phi) => rewrite_bqnf_expre...
bqnf_quantifier_rewriter()=default
Constructor.
virtual pbes_expression rewrite_bounded_exists(const pbes_expression &e)
Rewrites a bounded existential quantifier expression. rewrite_bounded_exists(exists v ....
virtual pbes_expression filter(const pbes_expression &e, const std::set< data::variable > &d)
Filters the expression e such that subexpressions that are data expression that do not refer to varia...
virtual pbes_expression rewrite_or(const pbes_expression &e)
Rewrites a disjunctive expression. rewrite_imp(\/_i phi_i) = \/_i rewrite_bqnf_expression(phi_i).
A visitor class for PBES equations in BQNF. There is a visit_<node> function for each type of node....