12#ifndef MCRL2_PBES_NORMAL_FORMS_H
13#define MCRL2_PBES_NORMAL_FORMS_H
15#include "mcrl2/pbes/traverser.h"
81 standard_form_pair result = m_expression_stack.back();
82 m_expression_stack.pop_back();
89 m_expression_stack.emplace_back(first, second);
95 core::identifier_string s = m_generator(hint);
103 std::map<pbes_expression, propositional_variable_instantiation>::iterator i = m_table.find(expr);
104 if (i != m_table.end())
110 m_table[expr] = varinst;
113 m_equations2.emplace_back(m_symbol, var, expr);
117 m_equations2.emplace_back(m_symbol, var, expr);
129 m_true = propositional_variable_instantiation(fresh_variable(
"True").name(), data::data_expression_list());
130 m_false = propositional_variable_instantiation(fresh_variable(
"False").name(), data::data_expression_list());
142 return m_expression_stack.back().first;
178 throw mcrl2::runtime_error(
"negation is not supported in standard recursive form algorithm");
184 standard_form_pair right = pop();
185 standard_form_pair left = pop();
186 if (left.second == standard_form_or)
188 left.first = create_variable(left.first, standard_form_or, m_name);
190 if (right.second == standard_form_or)
192 right.first = create_variable(right.first, standard_form_or, m_name);
194 push(and_(left.first, right.first), standard_form_and);
200 standard_form_pair right = pop();
201 standard_form_pair left = pop();
202 if (left.second == standard_form_and)
204 left.first = create_variable(left.first, standard_form_and, m_name);
206 if (right.second == standard_form_and)
208 right.first = create_variable(right.first, standard_form_and, m_name);
210 push(or_(left.first, right.first), standard_form_or);
216 throw mcrl2::runtime_error(
"implication is not supported in standard recursive form algorithm");
223 m_name = std::string(eq.variable().name()) +
'_';
229 standard_form_pair p = pop();
230 m_equations.emplace_back(eq.symbol(), eq.variable(), p.first);
236 assert(!x.equations().empty());
237 for (
const pbes_equation& eqn: x.equations())
239 m_generator.add_identifier(std::string(eqn.variable().name()));
247 assert(!m_equations.empty());
249 for (pbes_equation& eqn: m_equations2)
251 eqn.symbol() = sigma;
253 std::copy(m_equations2.begin(), m_equations2.end(), std::back_inserter(m_equations));
260 m_equations.emplace_back(fixpoint_symbol::nu(),
261 propositional_variable(atermpp::down_cast<propositional_variable_instantiation>(m_true).name()),
266 m_equations.emplace_back(fixpoint_symbol::mu(),
267 propositional_variable(atermpp::down_cast<propositional_variable_instantiation>(m_false).name()),
287 eqn.equations() = t.m_equations;
\brief The and operator for pbes expressions
static fixpoint_symbol nu()
Returns the nu symbol.
fixpoint_symbol & operator=(fixpoint_symbol &&) noexcept=default
fixpoint_symbol & operator=(const fixpoint_symbol &) noexcept=default
\brief The implication operator for pbes expressions
\brief The not operator for pbes expressions
\brief The or operator for pbes expressions
const fixpoint_symbol & symbol() const
Returns the fixpoint symbol of the equation.
pbes_expression & operator=(const pbes_expression &) noexcept=default
parameterized boolean equation system
const propositional_variable_instantiation & initial_state() const
Returns the initial state.
propositional_variable_instantiation & initial_state()
Returns the initial state.
\brief A propositional variable instantiation
propositional_variable_instantiation(const core::identifier_string &name, const data::data_expression_list ¶meters)
Constructor.
const core::identifier_string & name() const
\brief A propositional variable declaration
propositional_variable(const atermpp::aterm &term)
const core::identifier_string & name() const
propositional_variable(const core::identifier_string &name, const data::variable_list ¶meters)
\brief Constructor Z12.
Namespace for system defined sort bool_.
bool is_false_function_symbol(const atermpp::aterm &e)
Recogniser for function false.
bool is_true_function_symbol(const atermpp::aterm &e)
Recogniser for function true.
bool is_propositional_variable(const atermpp::aterm &x)
const pbes_expression & true_()
std::string boolean_variables2pgsolver(Iter first, Iter last, const variable_map &variables)
Convert a sequence of Boolean variables to PGSolver format.
bool is_or(const atermpp::aterm &x)
void bes2pgsolver(Iter first, Iter last, std::ostream &out, bool maxpg)
Save a sequence of BES equations in to a stream in PGSolver format.
void save_bes_pgsolver(const pbes &bes, std::ostream &stream, bool maxpg)
static std::string bes_expression2pgsolver(const pbes_expression &p, const variable_map &variables)
Convert a BES expression to PGSolver format.
bool is_propositional_variable_instantiation(const atermpp::aterm &x)
bool is_and(const atermpp::aterm &x)
void make_standard_form(pbes &eqn, bool recursive_form=false)
Transforms a PBES into standard form.
const pbes_expression & false_()