12#ifndef MCRL2_PBES_DETAIL_LTS2PBES_RHS_H
13#define MCRL2_PBES_DETAIL_LTS2PBES_RHS_H
15#include "mcrl2/pbes/replace.h"
16#include "mcrl2/pbes/detail/lps2pbes_par.h"
17#include "mcrl2/pbes/detail/lps2pbes_sat.h"
18#include "mcrl2/pbes/detail/lts2pbes_lts.h"
19#include "mcrl2/utilities/progress_meter.h"
32 return core::identifier_string(std::string(name) +
"'" + std::to_string(s));
52 template <
typename TermTraits>
63 using tr = TermTraits;
66 return tr::imp(left, right);
70 return tr::and_(left, right);
86 std::vector<data::variable> result;
87 for (
const process::action& a: actions)
89 for (
const data::sort_expression& s: a.label().sorts())
91 data::variable v(id_generator(
"v"), s);
95 return data::variable_list(result.begin(), result.end());
101 std::vector<data::data_expression> result;
102 for (
const process::action& a: actions)
104 auto const& args = a.arguments();
105 result.insert(result.end(), args.begin(), args.end());
107 return data::data_expression_list(result.begin(), result.end());
113 std::vector<pbes_equation> result;
114 for (
auto const& p: Zneg)
116 pbes_equation eqn(fixpoint_symbol::nu(), p, false_());
117 result.push_back(eqn);
119 for (
auto const& p: Zpos)
121 pbes_equation eqn(fixpoint_symbol::nu(), p, true_());
122 result.push_back(eqn);
129 std::vector<std::string> v;
130 for (
const process::action& ai: a.actions())
132 v.emplace_back(ai.label().name());
134 return utilities::string_join(v,
"_");
147 std::size_t n = lts0.get_transitions().size();
148 Zpos = std::vector<propositional_variable>(n);
149 Zneg = std::vector<propositional_variable>(n);
150 for (
const auto& p: lts1.state_map())
152 for (
const lts2pbes_lts::edge& e: p.second)
154 const lps::multi_action& ai = lts1.action_labels()[e.label];
155 data::variable_list actvars = action_variables(ai.actions());
156 std::string suffix = utilities::number2string(e.index) +
"_" + multi_action_name(ai);
157 core::identifier_string pos = id_generator(
"Zpos_" + suffix);
158 core::identifier_string neg = id_generator(
"Zneg_" + suffix);
159 Zpos[e.index] = propositional_variable(pos, s_list + actvars + t_list);
160 Zneg[e.index] = propositional_variable(neg, s_list + actvars + t_list);
167 std::vector<data::data_expression> v;
170 for (; i != d.end(); ++i, ++j)
172 v.push_back(data::equal_to(*i, *j));
174 return data::lazy::join_and(v.begin(), v.end());
177 template <
typename TermTraits>
183 lts2pbes_state_type s,
184 lts2pbes_state_type t,
188 using tr = TermTraits;
189 auto f = action_expressions(a.actions());
190 data::data_expression_list dx = data::data_expression_list({ data::sort_nat::nat(s) }) + f + data::data_expression_list({ data::sort_nat::nat(t) });
197 right1 = tr::or_(tr::and_(right, Pos), Neg);
198 return tr::imp(left, right1);
202 right1 = tr::and_(tr::or_(right, Neg), Pos);
203 return tr::and_(left, right1);
208template <
typename TermTraits,
typename Parameters>
210 lts2pbes_state_type s,
211 Parameters& parameters,
214template <
typename Derived,
typename TermTraits,
typename Parameters>
218 using tr = TermTraits;
229 Parameters& parameters_,
237 return static_cast<Derived&>(*
this);
242 result_stack.push_back(x);
247 return result_stack.back();
252 return result_stack.back();
258 result_stack.pop_back();
264 push(atermpp::down_cast<pbes_expression>(x));
279 throw mcrl2::runtime_error(
"rhs_lts2pbes_traverser: negation is not supported!");
286 push(tr::and_(left, right)
);
293 push(tr::or_(left, right)
);
298 throw mcrl2::runtime_error(
"rhs_lts2pbes_traverser: implication is not supported!");
316 std::vector<pbes_expression> v;
318 const auto& alpha = atermpp::down_cast<
const action_formulas::action_formula>(x.formula());
322 for (
const lts2pbes_lts::edge& e: lts1.edges(s))
324 lts2pbes_state_type t = e.state;
325 const lps::multi_action& a = lts1.action_labels()[e.label];
326 pbes_expression left = detail::Sat(a, alpha, parameters.id_generator, TermTraits());
327 pbes_expression right = RHS(phi, t, parameters, TermTraits());
328 pbes_expression p = parameters.rhs_may_must(
true, left, right, e.index, a, s, t, TermTraits());
331 push(tr::join_and(v.begin(), v.end()));
337 std::vector<pbes_expression> v;
339 const auto& alpha = atermpp::down_cast<
const action_formulas::action_formula>(x.formula());
343 for (
const lts2pbes_lts::edge& e: lts1.edges(s))
345 lts2pbes_state_type t = e.state;
346 const lps::multi_action& a = lts1.action_labels()[e.label];
347 pbes_expression left = detail::Sat(a, alpha, parameters.id_generator, TermTraits());
348 pbes_expression right = RHS(phi, t, parameters, TermTraits());
349 pbes_expression p = parameters.rhs_may_must(
false, left, right, e.index, a, s, t, TermTraits());
352 push(tr::join_or(v.begin(), v.end()));
357 throw mcrl2::runtime_error(
"rhs_lts2pbes_traverser: yaled is not supported!");
362 throw mcrl2::runtime_error(
"rhs_lts2pbes_traverser: yaled_timed is not supported!");
367 throw mcrl2::runtime_error(
"rhs_lts2pbes_traverser: yaled is not supported!");
372 throw mcrl2::runtime_error(
"rhs_lts2pbes_traverser: delay_timed is not supported!");
378 core::identifier_string X_s = make_identifier(X, s);
380 push(propositional_variable_instantiation(X_s, e + detail::Par(X, data::variable_list(), parameters.phi0)));
386 core::identifier_string X_s = make_identifier(X, s);
387 data::data_expression_list e = detail::mu_expressions(x);
388 push(propositional_variable_instantiation(X_s, e + detail::Par(X, data::variable_list(), parameters.phi0)));
394 core::identifier_string X_s = make_identifier(X, s);
395 data::data_expression_list e = detail::mu_expressions(x);
396 push(propositional_variable_instantiation(X_s, e + detail::Par(X, data::variable_list(), parameters.phi0)));
400template <
template <
class,
class,
class>
class Traverser,
typename TermTraits,
typename Parameters>
413template <
typename TermTraits,
typename Parameters>
415 lts2pbes_state_type s,
416 Parameters& parameters,
419 apply_rhs_lts2pbes_traverser<rhs_lts2pbes_traverser, TermTraits, Parameters> f(s, parameters, tr);
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
\brief A timed multi-action
This class contains labelled transition systems in .lts format.
\brief The existential quantification operator for pbes expressions
\brief The universal quantification operator for pbes expressions
\brief A propositional variable instantiation
The main namespace for the LPS library.
pbes_expression RHS(const state_formulas::state_formula &x, lts2pbes_state_type s, Parameters ¶meters, TermTraits tr)
core::identifier_string make_identifier(const core::identifier_string &name, lts2pbes_state_type s)
const pbes_expression & true_()
const pbes_expression & false_()
The main namespace for the Process library.
apply_rhs_lts2pbes_traverser(lts2pbes_state_type s, Parameters ¶meters, TermTraits tr)
data::data_expression equal_to(const data::variable_list &d, const data::data_expression_list &e) const
std::vector< pbes_equation > equations() const
lts2pbes_counter_example_parameters(const state_formulas::state_formula &phi0, const lts::lts_lts_t <s0, const lts2pbes_lts <s1, data::set_identifier_generator &id_generator, utilities::progress_meter &pm)
std::vector< propositional_variable > Zpos
pbes_expression rhs_may_must(bool is_must, const pbes_expression &left, const pbes_expression &right, std::size_t i, const lps::multi_action &a, lts2pbes_state_type s, lts2pbes_state_type t, TermTraits)
std::string multi_action_name(const lps::multi_action &a) const
data::variable_list s_list
data::variable_list t_list
std::vector< propositional_variable > Zneg
data::data_expression_list action_expressions(const process::action_list &actions) const
data::variable_list action_variables(const process::action_list &actions) const
utilities::progress_meter & pm
const state_formulas::state_formula & phi0
const lts::lts_lts_t & lts0
data::set_identifier_generator & id_generator
pbes_expression rhs_may_must(bool is_must, const pbes_expression &left, const pbes_expression &right, std::size_t, const lps::multi_action &, lts2pbes_state_type, lts2pbes_state_type, TermTraits)
const lts2pbes_lts & lts1
lts2pbes_parameters(const state_formulas::state_formula &phi0_, const lts::lts_lts_t <s0_, const lts2pbes_lts <s1_, data::set_identifier_generator &id_generator_, utilities::progress_meter &pm_)
rhs_lts2pbes_traverser(lts2pbes_state_type s_, Parameters ¶meters_, TermTraits)
void leave(const state_formulas::yaled_timed &)
void leave(const state_formulas::or_ &)
const pbes_expression & top() const
void apply(const state_formulas::exists &x)
void push(const pbes_expression &x)
void leave(const state_formulas::variable &x)
void leave(const state_formulas::true_ &)
void apply(const state_formulas::must &x)
void leave(const data::data_expression &x)
void apply(const state_formulas::forall &x)
void leave(const state_formulas::delay_timed &)
void apply(const state_formulas::mu &x)
void leave(const state_formulas::delay &)
void leave(const state_formulas::false_ &)
std::vector< pbes_expression > result_stack
void apply(const state_formulas::imp &)
void apply(const state_formulas::nu &x)
void apply(const state_formulas::may &x)
void leave(const state_formulas::and_ &)
void leave(const state_formulas::yaled &)
void apply(const state_formulas::not_ &)