12#ifndef MCRL2_PBES_REWRITERS_SIMPLIFY_QUANTIFIERS_REWRITER_H
13#define MCRL2_PBES_REWRITERS_SIMPLIFY_QUANTIFIERS_REWRITER_H
15#include "mcrl2/pbes/rewriters/simplify_rewriter.h"
21template <
template <
class>
class Builder,
class Derived>
24 using super = Builder<Derived>;
36 pbes_system::make_optimized_exists(result, variables, atermpp::down_cast<not_>(body).operand(),
true);
52 data::variable_list lv = data::detail::set_intersection(variables, find_free_variables(left));
53 data::variable_list rv = data::detail::set_intersection(variables, find_free_variables(right));
56 pbes_system::make_optimized_forall(result, rv, right,
true);
61 pbes_system::make_optimized_forall(result, lv, left,
true);
84 pbes_system::make_optimized_forall(result, variables, atermpp::down_cast<not_>(body).operand(),
true);
100 data::variable_list lv = data::detail::set_intersection(variables, find_free_variables(left));
101 data::variable_list rv = data::detail::set_intersection(variables, find_free_variables(right));
104 pbes_system::make_optimized_exists(result, rv, right,
true);
109 pbes_system::make_optimized_exists(result, lv, left,
true);
124template <
typename Derived>
128template <
typename Derived,
typename DataRewriter,
typename SubstitutionFunction>
160template <
typename DataRewriter>
166 const DataRewriter&
R;
180 template <
typename SubstitutionFunction>
\brief The existential quantification operator for pbes expressions
const data::variable_list & variables() const
const pbes_expression & body() const
\brief The universal quantification operator for pbes expressions
const pbes_expression & body() const
const data::variable_list & variables() const
void make_optimized_and(pbes_expression &result, const pbes_expression &p, const pbes_expression &q)
Make a conjunction.
bool is_not(const atermpp::aterm &x)
bool is_or(const atermpp::aterm &x)
void make_optimized_forall(pbes_expression &result, const data::variable_list &l, const pbes_expression &p, bool remove_variables=false)
Make a universal quantification If l is empty, p is returned.
void make_optimized_not(pbes_expression &result, const pbes_expression &p)
Make a negation.
void make_optimized_or(pbes_expression &result, const pbes_expression &p, const pbes_expression &q)
Make a disjunction.
void make_optimized_exists(pbes_expression &result, const data::variable_list &l, const pbes_expression &p, bool remove_variables=false)
Make an optimized existential quantification. If l is empty, p is returned.
bool is_and(const atermpp::aterm &x)
An empty struct that is used to denote the absence of a substitution. Used for rewriters.
void apply(T &result, const forall &x)
void apply(T &result, const exists &x)
simplify_quantifiers_data_rewriter_builder(const DataRewriter &R, SubstitutionFunction &sigma)
A rewriter that simplifies boolean expressions and quantifiers, and rewrites data expressions.
pbes_expression operator()(const pbes_expression &x, SubstitutionFunction &sigma) const
simplify_quantifiers_data_rewriter(const DataRewriter &R_)
pbes_expression operator()(const pbes_expression &x) const
A rewriter that simplifies boolean expressions and quantifiers.
pbes_expression operator()(const pbes_expression &x) const