12#ifndef MCRL2_PBES_REWRITERS_ONE_POINT_RULE_REWRITER_H
13#define MCRL2_PBES_REWRITERS_ONE_POINT_RULE_REWRITER_H
15#include "mcrl2/data/consistency.h"
16#include "mcrl2/data/rewriters/one_point_rule_rewriter.h"
17#include "mcrl2/pbes/find_equalities.h"
18#include "mcrl2/pbes/replace.h"
27template <
typename Derived>
35 return static_cast<Derived&>(*
this);
42 result = atermpp::down_cast<T>(r(x));
46 void apply(T& result,
const forall& x)
51 std::map<data::variable, std::set<data::data_expression> > inequalities = find_inequalities(body);
52 mCRL2log(log::log_level_t::debug) <<
"x = " << x << std::endl;
53 mCRL2log(log::log_level_t::debug) <<
"\ninequalities(body) = " << data::print_inequalities(inequalities) << std::endl;
54 if (!inequalities.empty())
56 auto p = data::make_one_point_rule_substitution(inequalities, x.variables());
57 data::mutable_map_substitution<>& sigma = p.first;
58 const std::vector<data::variable>& remaining_variables = p.second;
59 if (remaining_variables.size() != x.variables().size())
61 mCRL2log(log::log_level_t::debug) <<
"Apply substitution sigma = " << sigma <<
" to x = " << body << std::endl;
62 body = pbes_system::replace_variables_capture_avoiding(body, sigma);
63 mCRL2log(log::log_level_t::debug) <<
"sigma(x) = " << body << std::endl;
64 if (remaining_variables.empty())
66 mCRL2log(log::log_level_t::debug) <<
"Replaced " << x <<
"\nwith " << body << std::endl;
70 data::variable_list v(remaining_variables.begin(), remaining_variables.end());
71 mCRL2log(log::log_level_t::debug) <<
"Replaced " << x <<
"\nwith " << forall(v, body) << std::endl;
72 pbes_system::make_forall(result, v, body);
80 void apply(T& result,
const exists& x)
85 std::map<data::variable, std::set<data::data_expression> > equalities = find_equalities(body);
86 mCRL2log(log::log_level_t::debug) <<
"x = " << body <<
"\nequalities(x) = " << data::print_inequalities(equalities) << std::endl;
87 if (!equalities.empty())
89 auto p = data::make_one_point_rule_substitution(equalities, x.variables());
90 data::mutable_map_substitution<>& sigma = p.first;
91 const std::vector<data::variable>& remaining_variables = p.second;
92 if (remaining_variables.size() != x.variables().size())
94 mCRL2log(log::log_level_t::debug) <<
"Apply substitution sigma = " << sigma <<
" to x = " << body << std::endl;
95 body = pbes_system::replace_variables_capture_avoiding(body, sigma);
96 mCRL2log(log::log_level_t::debug) <<
"sigma(x) = " << body << std::endl;
97 if (remaining_variables.empty())
99 mCRL2log(log::log_level_t::debug) <<
"Replaced " << x <<
"\nwith " << body << std::endl;
103 data::variable_list v(remaining_variables.begin(), remaining_variables.end());
104 mCRL2log(log::log_level_t::debug) <<
"Replaced " << x <<
"\nwith " << exists(v, body) << std::endl;
105 pbes_system::make_exists(result, v, body);
115 void apply(T& result,
const not_& x)
121 result = atermpp::down_cast<T>(data::not_(atermpp::down_cast<data::data_expression>(operand)));
149 core::make_apply_builder<
detail::one_point_rule_rewrite_builder>().apply(result, x);
\brief The existential quantification operator for pbes expressions
const data::variable_list & variables() const
exists(const exists &) noexcept=default
Move semantics.
const pbes_expression & body() const
\brief The universal quantification operator for pbes expressions
const pbes_expression & body() const
const data::variable_list & variables() const
forall(const forall &) noexcept=default
Move semantics.
\brief The not operator for pbes expressions
not_(const pbes_expression &operand)
\brief Constructor Z14.
const pbes_expression & operand() const
A rewriter that applies one point rule quantifier elimination to a PBES.
pbes_expression operator()(const pbes_expression &x) const
Rewrites a pbes expression.
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
bool is_data_expression(const atermpp::aterm &x)
Test for a data_expression expression.