12#ifndef MCRL2_DATA_REWRITERS_IF_REWRITER_H
13#define MCRL2_DATA_REWRITERS_IF_REWRITER_H
15#include "mcrl2/data/rewriter.h"
16#include "mcrl2/data/builder.h"
17#include "mcrl2/data/consistency.h"
18#include "mcrl2/data/standard.h"
20namespace mcrl2::
data {
29 return application(x.head(), x.begin(), x.end(), [&](
const data_expression& x_i) {
return (j++ == i+1) ? y : x_i; });
35 for (std::size_t i = 0; i < x.size(); i++)
37 if (is_if_application(x[i]))
39 const auto& x_i = atermpp::down_cast<application>(x[i]);
40 const data_expression& b = x_i[0];
41 const data_expression& t1 = x_i[1];
42 const data_expression& t2 = x_i[2];
43 return if_(b, push_if_outside(replace_argument(x, i, t1)), push_if_outside(replace_argument(x, i, t2)));
49template <
typename Derived>
101 else if (is_if_application(t1))
103 const application& t1_ = atermpp::down_cast<application>(t1);
121 else if (is_if_application(t2))
123 const application& t2_ = atermpp::down_cast<application>(t2);
149 void apply(T& result,
const application& x)
151 if (is_if_application(x))
154 super::apply(b, x[0]);
156 super::apply(t1, x[1]);
158 super::apply(t2, x[2]);
163 super::apply(result, x);
164 result = push_if_outside(atermpp::down_cast<application>(result));
181 void apply(T& result,
const application& x)
183 if (is_if_application(x))
186 super::apply(b, x[0]);
188 super::apply(t1, x[1]);
190 super::apply(t2, x[2]);
191 result = apply_if(b, t1, t2);
195 super::apply(result, x);
196 result = push_if_outside(atermpp::down_cast<application>(result));
Rewriter that operates on data expressions.
application replace_argument(const application &x, std::size_t i, const data_expression &y)
data_expression push_if_outside(const application &x)
bool is_or(const data_expression &x)
Test if x is a disjunction.
bool is_false(const data_expression &x)
Test if x is false.
bool is_not(const data_expression &x)
Test if x is a negation.
application if_(const data_expression &arg0, const data_expression &arg1, const data_expression &arg2)
Application of function symbol if.
bool is_true(const data_expression &x)
Test if x is true.
bool is_imp(const data_expression &x)
Test if x is an implication.
bool is_and(const data_expression &x)
Test if x is a conjunction.
bool is_simple(const data_expression &x) const
data_expression apply_if(const data_expression &b, const data_expression &t1, const data_expression &t2)
void apply(T &result, const application &x)
void apply(T &result, const application &x)
if_rewrite_with_rewriter_builder(data::rewriter &rewr_)
data_expression operator()(const data_expression &x) const