12#include "mcrl2/pbes/io.h"
13#include "mcrl2/pbes/join.h"
14#include "mcrl2/pbes/normal_forms.h"
26template <
typename Iter>
29 std::set<std::size_t> variables_int;
30 for (Iter i = first; i != last; ++i)
33 variable_map::const_iterator j = variables.find(b.name());
34 if (j == variables.end())
36 throw mcrl2::runtime_error(
"Found undeclared variable in boolean_variables2pgsolver: " + pbes_system::pp(b));
38 variables_int.insert(j->second);
40 return utilities::string_join(variables_int,
", ");
51 std::set<pbes_expression> expressions = split_and(p);
52 result = boolean_variables2pgsolver(expressions.begin(), expressions.end(), variables);
56 std::set<pbes_expression> expressions = split_or(p);
57 result = boolean_variables2pgsolver(expressions.begin(), expressions.end(), variables);
62 variable_map::const_iterator i = variables.find(b.name());
63 if (i == variables.end())
65 throw mcrl2::runtime_error(
"Found undeclared variable in bes_expression2cwi: " + pbes_system::pp(p));
67 std::stringstream out;
73 throw mcrl2::runtime_error(
"Unknown or unsupported expression encountered in bes_expression2cwi: " + pbes_system::pp(p));
81template <
typename Iter>
82void bes2pgsolver(Iter first, Iter last, std::ostream& out,
bool maxpg)
87 variable_map variables;
88 std::size_t index = 0;
89 std::map<
int,
int> block_to_player;
91 bool and_in_block =
false;
94 for (Iter i = first; i != last; ++i)
96 if(i->symbol() != sigma)
98 block_to_player[block++] = (and_in_block)?1:0;
102 variables[i->variable().name()] = index++;
103 and_in_block = and_in_block || is_and(i->formula());
105 block_to_player[block] = (and_in_block)?1:0;
107 if(maxpg && block % 2 == 1)
112 out <<
"parity " << index -1 <<
";\n";
116 for (Iter i = first; i != last; ++i)
118 if(i->symbol() != sigma)
124 out << variables[i->variable().name()]
126 << (maxpg?(block-priority):priority)
128 << (is_and(i->formula()) ? 1 : (is_or(i->formula())?0:block_to_player[priority]))
130 << bes_expression2pgsolver(i->formula(), variables)
131#ifdef MCRL2_BES2PGSOLVER_PRINT_VARIABLE_NAMES
134 << pbes_systembes::pp(i->variable())
143 pbes bes_standard_form(bes);
147 std::stringstream ss;
148 ss <<
"The initial state " << bes_standard_form.initial_state() <<
" and the left hand side "
149 "of the first equation (" << bes_standard_form.equations().front().variable() <<
") do "
150 "not correspond. Cannot save BES to PGSolver format.";
151 throw mcrl2::runtime_error(ss.str());
153 bes2pgsolver(bes_standard_form.equations().begin(), bes_standard_form.equations().end(), stream, maxpg);
static fixpoint_symbol nu()
Returns the nu symbol.
fixpoint_symbol & operator=(fixpoint_symbol &&) noexcept=default
parameterized boolean equation system
const propositional_variable_instantiation & initial_state() const
Returns the initial state.
\brief A propositional variable instantiation
const core::identifier_string & name() const
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.