12#ifndef MCRL2_PBES_DETAIL_LPS2PBES_RHS_H
13#define MCRL2_PBES_DETAIL_LPS2PBES_RHS_H
15#include "mcrl2/atermpp/aterm.h"
16#include "mcrl2/data/consistency.h"
17#include "mcrl2/data/data_expression.h"
18#include "mcrl2/pbes/detail/lps2pbes_par.h"
19#include "mcrl2/pbes/detail/lps2pbes_sat.h"
20#include "mcrl2/pbes/replace.h"
48 template <
typename TermTraits>
50 const data::variable_list& y,
54 const data::assignment_list& ,
58 using tr = TermTraits;
61 return tr::forall(y, tr::imp(left, right));
65 return tr::exists(y, tr::and_(left, right));
80 std::vector<data::variable> result;
81 for (
const process::action& a: actions)
83 for (
const data::sort_expression& s: a.label().sorts())
85 data::variable v(id_generator(
"v"), s);
89 return data::variable_list(result.begin(), result.end());
95 std::vector<data::data_expression> result;
96 for (
const process::action& a: actions)
98 auto const& args = a.arguments();
99 result.insert(result.end(), args.begin(), args.end());
101 return data::data_expression_list(result.begin(), result.end());
107 std::vector<pbes_equation> result;
108 for (
auto const& p: Zneg)
110 pbes_equation eqn(fixpoint_symbol::nu(), p.second, false_());
111 result.push_back(eqn);
113 for (
auto const& p: Zpos)
115 pbes_equation eqn(fixpoint_symbol::nu(), p.second, true_());
116 result.push_back(eqn);
123 std::vector<std::string> v;
124 for (
const process::action& ai: a.actions())
126 v.emplace_back(ai.label().name());
128 return utilities::string_join(v,
"_");
138 const data::variable_list& d = lps.process_parameters();
139 sigma = detail::make_fresh_variable_substitution(d, id_generator);
140 d1 = data::replace_variables(d, sigma);
142 std::size_t index = 0;
143 for (
const lps::action_summand& summand: lps.action_summands())
145 const lps::multi_action& ai = summand.multi_action();
146 data::variable_list actvars = action_variables(ai.actions());
147 core::identifier_string pos = id_generator(
"Zpos_" + utilities::number2string(index) +
"_" + multi_action_name(ai));
148 core::identifier_string neg = id_generator(
"Zneg_" + utilities::number2string(index) +
"_" + multi_action_name(ai));
149 Zpos[ai] = propositional_variable(pos, d + actvars + d1);
150 Zneg[ai] = propositional_variable(neg, d + actvars + d1);
157 std::vector<data::data_expression> v;
160 for (; i != d.end(); ++i, ++j)
162 v.push_back(data::equal_to(*i, *j));
164 return data::lazy::join_and(v.begin(), v.end());
167 template <
typename TermTraits>
169 const data::variable_list& y,
173 const data::assignment_list& gi,
177 using tr = TermTraits;
178 const data::variable_list& d = lps.process_parameters();
179 auto de =
data::data_expression_list(d);
181 data::data_expression_list gi1 = data::replace_variables(de, data::assignment_sequence_substitution(gi));
182 auto fi = action_expressions(ai.actions());
183 data::data_expression_list da = data::data_expression_list(de) + fi + gi1;
190 right1 = tr::or_(tr::and_(right, Pos), Neg);
191 return tr::forall(y, tr::imp(left, right1));
195 right1 = tr::and_(tr::or_(right, Neg), Pos);
196 return tr::exists(y, tr::and_(left, right1));
203template <
typename TermTraits,
typename Parameters>
206template <
typename Derived,
typename TermTraits,
typename Parameters>
210 using tr = TermTraits;
211 using pbes_expression =
typename tr::term_type;
226 return static_cast<Derived&>(*
this);
229 void push(
const pbes_expression& x)
231 result_stack.push_back(x);
236 return result_stack.back();
239 const pbes_expression&
top()
const
241 return result_stack.back();
246 pbes_expression result = top();
247 result_stack.pop_back();
253 for (
const data::variable& v: variables)
255 parameters.id_generator.add_identifier(v.name());
261 for (
const data::variable& v: variables)
263 parameters.id_generator.remove_identifier(v.name());
274 push(atermpp::down_cast<pbes_expression>(x));
289 throw mcrl2::runtime_error(
"rhs_traverser: negation is not supported!");
294 pbes_expression right =
pop();
295 pbes_expression left =
pop();
296 push(tr::and_(left, right)
);
301 pbes_expression right =
pop();
302 pbes_expression left =
pop();
303 push(tr::or_(left, right)
);
308 throw mcrl2::runtime_error(
"rhs_traverser: implication is not supported!");
330 template <
typename MustMayExpression>
333 return RHS(x.operand(),
parameters, TermTraits());
343 template <
typename MustMayExpression>
347 std::vector<pbes_expression> v;
348 pbes_expression rhs_phi =
derived().apply_may_must_rhs(x);
357 const data::variable_list& yi = summand.summation_variables();
359 pbes_expression right = rhs_phi;
361 pbes_expression sat = Sat(ai, alpha,
parameters.id_generator, TermTraits());
362 data::mutable_map_substitution<> sigma;
363 for (
const data::assignment& a: gi)
365 sigma[a.lhs()] = a.rhs();
367 pbes_expression left = tr::and_(sat, atermpp::down_cast<pbes_expression>(ci));
371 sigma[parameters.T] = ti;
372 left = tr::and_(left, atermpp::down_cast<pbes_expression>(data::greater(ti, parameters.T)));
375 right = pbes_system::replace_variables_capture_avoiding(right, sigma);
377 pbes_expression p =
parameters.rhs_may_must(is_must, yi, left, right, ai, gi, TermTraits());
378 v.push_back(derived().apply_may_must_result(p));
381 pbes_expression result = is_must ? tr::join_and(v.begin(), v.end()) : tr::join_or(v.begin(), v.end());
387 apply_may_must(x,
true);
392 apply_may_must(x,
false);
397 throw mcrl2::runtime_error(
"rhs_traverser: yaled is not supported!");
403 std::vector<pbes_expression> v;
408 const data::variable_list& yi = i.summation_variables();
409 pbes_expression p = tr::forall(yi, tr::or_(tr::not_(atermpp::down_cast<pbes_expression>(ci)), atermpp::down_cast<pbes_expression>(data::greater(t, ti))));
416 const data::variable_list& yj = j.summation_variables();
417 pbes_expression p = tr::forall(yj, tr::or_(tr::not_(atermpp::down_cast<pbes_expression>(cj)), atermpp::down_cast<pbes_expression>(data::greater(t, tj))));
420 push(tr::and_(tr::join_or(v.begin(), v.end()), atermpp::down_cast<pbes_expression>(data::greater(t, parameters.T))));
425 throw mcrl2::runtime_error(
"rhs_traverser: delay is not supported!");
431 std::vector<pbes_expression> v;
436 const data::variable_list& yi = i.summation_variables();
437 pbes_expression p = tr::exists(yi, tr::and_(atermpp::down_cast<pbes_expression>(ci), atermpp::down_cast<pbes_expression>(data::less_equal(t, ti))));
444 const data::variable_list& yj = j.summation_variables();
445 pbes_expression p = tr::exists(yj, tr::and_(atermpp::down_cast<pbes_expression>(cj), atermpp::down_cast<pbes_expression>(data::less_equal(t, tj))));
448 push(tr::or_(tr::join_or(v.begin(), v.end()), atermpp::down_cast<pbes_expression>(data::less_equal(t, parameters.T))));
455 data::variable_list xp = parameters.lps.process_parameters();
456 data::data_expression_list e = d + xp + Par(X, data::variable_list(), parameters.phi0);
459 e.push_front(parameters.T);
461 push(propositional_variable_instantiation(X, e));
467 data::data_expression_list d = detail::mu_expressions(x);
468 data::variable_list xp = parameters.lps.process_parameters();
469 data::data_expression_list e = d + xp + Par(X, data::variable_list(), parameters.phi0);
472 e.push_front(parameters.T);
474 push(propositional_variable_instantiation(X, e));
480 data::data_expression_list d = detail::mu_expressions(x);
481 data::variable_list xp = parameters.lps.process_parameters();
482 data::data_expression_list e = d + xp + Par(X, data::variable_list(), parameters.phi0);
485 e.push_front(parameters.T);
487 push(propositional_variable_instantiation(X, e));
491template <
template <
class,
class,
class>
class Traverser,
typename TermTraits,
typename Parameters>
504template <
typename TermTraits,
typename Parameters>
508 apply_rhs_traverser<rhs_traverser, TermTraits, Parameters> f(parameters, tr);
515template <
typename TermTraits,
typename Parameters>
518 Parameters& parameters,
519 const data::variable_list& variables,
521 std::vector<pbes_equation>& equations,
525template <
typename Derived,
typename TermTraits,
typename Parameters>
529 using tr = TermTraits;
537 using super::is_timed;
538 using super::parameters;
539 using super::apply_may_must;
540 using super::derived;
547 const data::variable_list& variables_,
549 std::vector<pbes_equation>& equations_,
552 : super(parameters, tr),
560 std::set<data::variable> fv = state_formulas::find_free_variables(x);
561 fv.insert(variables.begin(), variables.end());
562 return data::variable_list(fv.begin(), fv.end());
568 variables.insert(v.begin(), v.end());
573 for (
const data::variable& var: x.variables())
575 variables.erase(var);
582 variables.insert(v.begin(), v.end());
587 for (
const data::variable& var: x.variables())
589 variables.erase(var);
594 template <
typename MustMayExpression>
597 return RHS_structured(x.operand(), parameters, rhs_structured_compute_variables(x.operand(), variables), sigma, equations, TermTraits());
604 core::identifier_string Y = parameters.id_generator(
"Y");
605 data::variable_list d(variables.begin(), variables.end());
608 equations.push_back(eqn);
609 return propositional_variable_instantiation(Y, data::make_data_expression_list(d));
614 apply_may_must(x,
true);
619 apply_may_must(x,
false);
623template <
template <
class,
class,
class>
class Traverser,
typename TermTraits,
typename Parameters>
632 const data::variable_list& variables,
634 std::vector<pbes_equation>& equations,
641template <
typename TermTraits,
typename Parameters>
644 Parameters& parameters,
645 const data::variable_list& variables,
647 std::vector<pbes_equation>& equations,
651 apply_rhs_structured_traverser<rhs_structured_traverser, TermTraits, Parameters> f(parameters, variables, sigma, equations, tr);
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
LPS summand containing a multi-action.
const data::assignment_list & assignments() const
Returns the sequence of assignments.
LPS summand containing a deadlock.
const data::data_expression & time() const
Returns the time.
\brief A timed multi-action
const data::data_expression & time() const
pbes_equation(const fixpoint_symbol &symbol, const propositional_variable &variable, const pbes_expression &expr)
Constructor.
\brief A propositional variable instantiation
\brief A propositional variable declaration
const data::variable & undefined_real_variable()
Returns a data variable that corresponds to 'undefined'.
The main namespace for the LPS library.
pbes_expression RHS(const state_formulas::state_formula &x, Parameters ¶meters, TermTraits tr)
TermTraits::term_type RHS_structured(const state_formulas::state_formula &x, Parameters ¶meters, const data::variable_list &variables, const fixpoint_symbol &sigma, std::vector< pbes_equation > &equations, TermTraits tr)
const pbes_expression & true_()
const pbes_expression & false_()
The main namespace for the Process library.
apply_rhs_structured_traverser(Parameters ¶meters, const data::variable_list &variables, const fixpoint_symbol &sigma, std::vector< pbes_equation > &equations, TermTraits tr)
apply_rhs_traverser(Parameters ¶meters, TermTraits tr)
data::mutable_map_substitution sigma
std::string multi_action_name(const lps::multi_action &a) const
data::data_expression equal_to(const data::variable_list &d, const data::data_expression_list &e) const
std::map< lps::multi_action, propositional_variable > Zneg
lps2pbes_counter_example_parameters(const state_formulas::state_formula &phi0, const lps::stochastic_linear_process &lps, data::set_identifier_generator &id_generator, const data::variable &T)
std::map< lps::multi_action, propositional_variable > Zpos
data::variable_list action_variables(const process::action_list &actions) const
pbes_expression rhs_may_must(bool is_must, const data::variable_list &y, const pbes_expression &left, const pbes_expression &right, const lps::multi_action &ai, const data::assignment_list &gi, TermTraits)
data::data_expression_list action_expressions(const process::action_list &actions) const
std::vector< pbes_equation > equations() const
pbes_expression rhs_may_must(bool is_must, const data::variable_list &y, const pbes_expression &left, const pbes_expression &right, const lps::multi_action &, const data::assignment_list &, TermTraits)
const state_formulas::state_formula & phi0
lps2pbes_parameters(const state_formulas::state_formula &phi0_, const lps::stochastic_linear_process &lps_, data::set_identifier_generator &id_generator_, const data::variable &T_)
data::set_identifier_generator & id_generator
pbes_expression apply_may_must_rhs(const MustMayExpression &x)
const fixpoint_symbol & sigma
void leave(const state_formulas::forall &x)
data::variable_list rhs_structured_compute_variables(const state_formulas::state_formula &x, const std::multiset< data::variable > &variables) const
std::multiset< data::variable > variables
void leave(const state_formulas::exists &x)
rhs_structured_traverser(Parameters ¶meters, const data::variable_list &variables_, const fixpoint_symbol &sigma_, std::vector< pbes_equation > &equations_, TermTraits tr)
void apply(const state_formulas::may &x)
void enter(const state_formulas::forall &x)
std::vector< pbes_equation > & equations
void enter(const state_formulas::exists &x)
pbes_expression apply_may_must_result(const pbes_expression &p)
void apply(const state_formulas::must &x)
void apply(const state_formulas::not_ &)
pbes_expression apply_may_must_rhs(const MustMayExpression &x)
void leave(const state_formulas::delay_timed &x)
void apply(const state_formulas::must &x)
void apply(const state_formulas::may &x)
void push(const pbes_expression &x)
rhs_traverser(Parameters ¶meters_, TermTraits)
void apply_may_must(const MustMayExpression &x, bool is_must)
void leave(const state_formulas::or_ &)
void leave(const state_formulas::yaled_timed &x)
void pop_variables(const data::variable_list &variables)
void apply(const state_formulas::forall &x)
void leave(const state_formulas::true_ &)
void apply(const state_formulas::mu &x)
void apply(const state_formulas::exists &x)
std::vector< pbes_expression > result_stack
void apply(const state_formulas::imp &)
void push_variables(const data::variable_list &variables)
void leave(const state_formulas::and_ &)
void apply(const state_formulas::nu &x)
pbes_expression apply_may_must_result(const pbes_expression &p)
void leave(const state_formulas::yaled &)
void leave(const state_formulas::false_ &)
void leave(const state_formulas::delay &)
const pbes_expression & top() const
void leave(const state_formulas::variable &x)
void leave(const data::data_expression &x)