12#ifndef MCRL2_LPS_ACTION_RENAME_H
13#define MCRL2_LPS_ACTION_RENAME_H
17#include "mcrl2/core/parse.h"
19#include "mcrl2/data/rewriter.h"
20#include "mcrl2/data/substitutions/mutable_map_substitution.h"
22#include "mcrl2/lps/stochastic_specification.h"
23#include "mcrl2/process/normalize_sorts.h"
24#include "mcrl2/process/replace.h"
25#include "mcrl2/process/translate_user_notation.h"
86 assert(
core::
detail::check_rule_ActionRenameRule(t));
88 m_variables = atermpp::down_cast<data::variable_list>(*i++);
89 m_condition = data::data_expression(*i++);
90 m_lhs = process::action(*i++);
91 m_rhs = process::process_expression(*i);
178 assert(
core::
detail::check_rule_ActionRenameSpec(t));
181 m_action_labels = atermpp::down_cast<process::action_label_list>((*i++)[0]);
183 atermpp::
aterm_list rules_list = atermpp::down_cast<atermpp::aterm_list>((*i)[0]);
184 for (
const atermpp::aterm& r: rules_list)
186 m_rules.push_back(action_rename_rule(r));
197 const std::vector <action_rename_rule>& rules)
222 return m_action_labels;
228 return m_action_labels;
261 std::vector<atermpp::aterm> rules;
262 for (
const action_rename_rule& r: spec.rules())
264 rules.push_back(action_rename_rule_to_aterm(r));
266 return atermpp::aterm(core::detail::function_symbol_ActionRenameSpec(),
267 data::detail::data_specification_to_aterm(spec.data()),
268 atermpp::aterm(core::detail::function_symbol_ActSpec(), spec.action_labels()),
269 atermpp::aterm(core::detail::function_symbol_ActionRenameRules(), atermpp::aterm_list(rules.begin(), rules.end()))
288 std::map<data::data_expression, data::data_expression>& replacement_map)
296 fill_replacement_map(data::sort_bool::left(equalities_in_conjunction),replacement_map);
297 fill_replacement_map(data::sort_bool::right(equalities_in_conjunction),replacement_map);
300 if(is_equal_to_application(equalities_in_conjunction))
302 const data::application a=
atermpp::down_cast<
data::application>(equalities_in_conjunction);
305 replacement_map[a[1]]=a[0];
313 const std::map<data::data_expression, data::data_expression>& replacement_map)
317 return data::sort_bool::and_(replace_expressions(data::sort_bool::left(e),replacement_map),
318 replace_expressions(data::sort_bool::right(e),replacement_map));
322 return data::sort_bool::not_(replace_expressions(data::sort_bool::arg(e),replacement_map));
324 if (is_equal_to_application(e))
327 return data::application(a.head(),
328 replace_expressions(a[0],replacement_map),
329 replace_expressions(a[1],replacement_map));
331 const std::map<data::data_expression, data::data_expression>::const_iterator i=replacement_map.find(e);
332 if (i!=replacement_map.end())
342 std::map<data::data_expression, data::data_expression> replacement_map;
343 fill_replacement_map(equalities_in_conjunction, replacement_map);
344 return replace_expressions(e,replacement_map);
352template <
typename IdentifierGenerator>
355 data::mutable_map_substitution<> renamings;
357 std::set< data::variable > new_vars = data::find_all_variables(rleft.arguments());
359 for (
const data::variable& v: new_vars)
361 mcrl2::core::identifier_string new_name = generator(std::string(v.name()));
363 if (new_name != v.name())
365 renamings[v] = data::variable(new_name, v.sort());
370 for (
const data::variable& v: data::substitution_variables(renamings))
372 id_generator.add_identifier(v.name());
374 rcond = data::replace_variables_capture_avoiding(rcond, renamings, id_generator);
375 rleft = process::replace_variables_capture_avoiding(rleft, renamings, id_generator);
376 rright = process::replace_variables_capture_avoiding(rright, renamings, id_generator);
386 for (action_rename_rule& rule: arspec.rules())
388 rule = action_rename_rule(data::normalize_sorts(rule.variables(), arspec.data()),
389 data::normalize_sorts(rule.condition(), arspec.data()),
390 process::normalize_sorts(rule.lhs(), arspec.data()),
391 process::normalize_sorts(rule.rhs(), arspec.data()));
401 for (action_rename_rule& rule: arspec.rules())
403 rule = action_rename_rule(rule.variables(),
404 data::translate_user_notation(rule.condition()),
405 process::translate_user_notation(rule.lhs()),
406 process::translate_user_notation(rule.rhs()));
432 const bool enable_rewriting)
434 using namespace mcrl2::
core;
435 using namespace mcrl2::
data;
436 using namespace mcrl2::
lps;
438 const std::vector <action_rename_rule>& rename_rules = action_rename_spec.rules();
444 generator.add_identifiers(lps::find_identifiers(lps_old_spec));
445 generator.add_identifiers(data::function_and_mapping_identifiers(lps_old_spec.data()));
448 mCRL2log(log::debug) <<
"Rename rules found: " << rename_rules.size() <<
"\n";
449 for (
const action_rename_rule& r: rename_rules)
451 stochastic_action_summand_vector lps_new_action_summands;
453 data_expression rule_condition = r.condition();
454 process::action rule_old_action = r.lhs();
455 process::action rule_new_action;
456 process::process_expression new_element = r.rhs();
457 if (!is_tau(new_element) && !is_delta(new_element))
459 rule_new_action = atermpp::down_cast<process::action>(new_element);
462 const bool to_tau = is_tau(new_element);
463 const bool to_delta = is_delta(new_element);
475 for (
const data_expression& rule_old_argument_i: rule_old_action.arguments())
477 if (!is_variable(rule_old_argument_i) &&
478 (!(data::find_all_variables(rule_old_argument_i).empty())))
480 throw mcrl2::runtime_error(
"The arguments of the lhs " + process::pp(rule_old_action) +
481 " are not variables or closed expressions");
486 std::set < variable > variables_in_old_rule = process::find_free_variables(rule_old_action);
487 std::set < variable > variables_in_new_rule = process::find_free_variables(rule_new_action);
489 if (!includes(variables_in_old_rule.begin(),variables_in_old_rule.end(),
490 variables_in_new_rule.begin(),variables_in_new_rule.end()))
492 throw mcrl2::runtime_error(
"There are variables occurring in rhs " + process::pp(rule_new_action) +
493 " of a rename rule not occurring in lhs " + process::pp(rule_old_action));
497 std::set < variable > variables_in_condition = data::find_free_variables(rule_condition);
498 if (!includes(variables_in_old_rule.begin(),variables_in_old_rule.end(),
499 variables_in_condition.begin(),variables_in_condition.end()))
501 throw mcrl2::runtime_error(
"There are variables occurring in the condition " + data::pp(rule_condition) +
502 " of a rename rule not occurring in lhs " + process::pp(rule_old_action));
507 for (
const data_expression& d: rule_old_action.arguments())
511 const variable& v = atermpp::down_cast<variable>(d);
512 if (variables_in_old_rule.find(v)==variables_in_old_rule.end())
514 throw mcrl2::runtime_error(
"Variable " + data::pp(v) +
" occurs more than once in lhs " +
515 process::pp(rule_old_action) +
" of an action rename rule");
519 variables_in_old_rule.erase(v);
523 assert(variables_in_old_rule.empty());
527 mCRL2log(log::debug) <<
"Action summands found: " << lps_old_action_summands.size() <<
"\n";
528 for (
const stochastic_action_summand& lps_old_action_summand: lps_old_action_summands)
530 process::action_list lps_old_actions = lps_old_action_summand.multi_action().actions();
533
534
535
536
538 std::vector < variable_list >
539 lps_new_sum_vars(1,lps_old_action_summand.summation_variables());
540 std::vector < data_expression > lps_new_condition(1,lps_old_action_summand.condition());
541 std::vector < process::action_list >
542 lps_new_actions(1,process::action_list());
543 std::vector <
bool > lps_new_actions_is_delta(1,
false);
545 mCRL2log(log::debug) <<
"Actions in summand found: " << lps_old_actions.size() <<
"\n";
546 for (
const process::action& lps_old_action: lps_old_actions)
548 if (equal_signatures(lps_old_action, rule_old_action))
550 mCRL2log(log::debug) <<
"Renaming action " << rule_old_action <<
"\n";
553 data_expression renamed_rule_condition=rule_condition;
554 process::action renamed_rule_old_action=rule_old_action;
555 process::action renamed_rule_new_action=rule_new_action;
556 detail::rename_renamerule_variables(renamed_rule_condition, renamed_rule_old_action, renamed_rule_new_action, generator);
559 data_expression_list::iterator lps_old_argument_i = lps_old_action.arguments().begin();
560 data_expression new_equalities_condition=sort_bool::true_();
561 for (
const data_expression& rule_old_argument_i: renamed_rule_old_action.arguments())
563 if (is_variable(rule_old_argument_i))
565 new_equalities_condition=lazy::and_(new_equalities_condition,
566 data::equal_to(rule_old_argument_i, *lps_old_argument_i));
570 assert((data::find_all_variables(rule_old_argument_i).empty()));
571 renamed_rule_condition=
572 lazy::and_(renamed_rule_condition,
573 data::equal_to(rule_old_argument_i, *lps_old_argument_i));
574 if (enable_rewriting) renamed_rule_condition=rewr(renamed_rule_condition);
576 lps_old_argument_i++;
580 for (data_expression& d: lps_new_condition)
582 d=lazy::and_(d,new_equalities_condition);
586 std::set<variable> new_vars = find_all_variables(renamed_rule_old_action);
587 for (
const variable& sdvi: new_vars)
589 for (variable_list& l: lps_new_sum_vars)
595 if (enable_rewriting) renamed_rule_condition=rewr(renamed_rule_condition);
596 if (renamed_rule_condition==sort_bool::true_())
600 std::vector <
bool >::iterator i_is_delta=lps_new_actions_is_delta.begin();
601 for (process::action_list& l: lps_new_actions)
603 l=process::action_list();
610 std::vector <
bool >::iterator i_is_delta=lps_new_actions_is_delta.begin();
611 for (process::action_list& l: lps_new_actions)
615 l.push_front(renamed_rule_new_action);
621 else if (renamed_rule_condition==sort_bool::false_())
623 std::vector <
bool >::iterator i_is_delta=lps_new_actions_is_delta.begin();
624 for (process::action_list& l: lps_new_actions)
628 l.push_front(lps_old_action);
637
639 std::vector < process::action_list > lps_new_actions_temp(lps_new_actions);
643 std::vector <
bool >::iterator i_is_delta=lps_new_actions_is_delta.begin();
644 for (process::action_list& l: lps_new_actions)
648 l=process::action_list();
653 l.push_front(renamed_rule_new_action);
660 for (process::action_list& l: lps_new_actions_temp)
662 lps_new_actions_is_delta.push_back(
false);
663 l.push_front(lps_old_action);
666 lps_new_actions.insert(lps_new_actions.end(),
667 lps_new_actions_temp.begin(),
668 lps_new_actions_temp.end());
669 assert(lps_new_actions_is_delta.size()==lps_new_actions.size());
672
673
675 std::vector < data_expression > lps_new_condition_temp(lps_new_condition);
677 for (data_expression& d: lps_new_condition)
680 d=lazy::and_(renamed_rule_condition,detail::substitute_equalities(d,renamed_rule_condition));
683 for (
const data_expression& d: lps_new_condition_temp)
686 lps_new_condition.push_back(lazy::and_(d,sort_bool::not_(renamed_rule_condition)));
691 std::size_t size=lps_new_sum_vars.size();
692 lps_new_sum_vars.reserve(2*size);
693 for(std::size_t i=0; i<size; ++i)
695 lps_new_sum_vars.push_back(lps_new_sum_vars[i]);
701 for (process::action_list& l: lps_new_actions)
703 l.push_front(lps_old_action);
706 mCRL2log(log::debug) <<
"Action done\n";
712 std::vector < process::action_list > :: iterator i_act=lps_new_actions.begin();
713 std::vector <
bool > :: iterator i_act_is_delta=lps_new_actions_is_delta.begin();
714 std::vector < variable_list > :: iterator i_sumvars=lps_new_sum_vars.begin();
715 for (
const data_expression& cond: lps_new_condition)
721 const deadlock_summand d(*i_sumvars,
723 deadlock(lps_old_action_summand.multi_action().time()));
724 lps_deadlock_summands.push_back(d);
729 stochastic_action_summand lps_new_summand(*i_sumvars,
731 multi_action(reverse(*i_act), lps_old_action_summand.multi_action().time()),
732 lps_old_action_summand.assignments(),
733 lps_old_action_summand.distribution());
734 lps_new_action_summands.push_back(lps_new_summand);
741 lps_old_action_summands = lps_new_action_summands;
747 lps_deadlock_summands,
748 lps_old_action_summands);
752 for (
const process::action_label& a: lps_old_spec.action_labels())
754 if (std::find(action_rename_spec.action_labels().begin(),
755 action_rename_spec.action_labels().end(),a)==action_rename_spec.action_labels().end())
763 lps_old_spec.global_variables(),
765 lps_old_spec.initial_process());
783
784
785
788 const std::regex& matching_regex,
789 const std::string& replacing_fmt,
793 std::set<process::action_label> new_actions_set;
795 for(
const process::action_label& act: lps_old_spec.action_labels())
797 process::action_label new_action_label(detail::rename_action_label(act, matching_regex, replacing_fmt));
798 if (std::string(new_action_label.name()).empty())
800 throw mcrl2::runtime_error(
"After renaming the action " + std::string(act.name()) +
" becomes empty, which is not allowed.");
802 if(std::string(new_action_label.name()) !=
"delta" && std::string(new_action_label.name()) !=
"tau" &&
803 new_actions_set.find(new_action_label) == new_actions_set.end())
806 new_actions_set.insert(new_action_label);
807 new_actions.push_front(new_action_label);
810 new_actions = reverse(new_actions);
813 std::vector<stochastic_action_summand> new_action_summands;
815 std::vector<deadlock_summand> new_deadlock_summands(lps_old_spec.process().deadlock_summands());
816 for(
const stochastic_action_summand& as: lps_old_spec.process().action_summands())
818 process::action_list new_action_list;
819 bool becomes_deadlock_summand =
false;
820 for(
const process::action& act: as.multi_action().actions())
822 process::action_label new_action_label(detail::rename_action_label(act.label(), matching_regex, replacing_fmt));
823 if(std::string(new_action_label.name()) ==
"delta")
827 becomes_deadlock_summand =
true;
832 if(std::string(new_action_label.name()) !=
"tau")
834 new_action_list.push_front(process::action(new_action_label, act.arguments()));
838 if(!becomes_deadlock_summand)
840 new_action_list = reverse(new_action_list);
841 multi_action new_multi_action(new_action_list, as.multi_action().time());
844 stochastic_action_summand new_summand(as.summation_variables(), as.condition(), new_multi_action, as.assignments(), as.distribution());
845 new_action_summands.push_back(new_summand);
850 new_deadlock_summands.push_back(deadlock_summand(as.summation_variables(), as.condition(), deadlock(as.multi_action().time())));
855 new_deadlock_summands,
856 new_action_summands);
859 lps_old_spec.global_variables(),
861 lps_old_spec.initial_process());
888 for(
const mcrl2::lps::action_rename_rule& r: s.rules())
term_appl_iterator< aterm > iterator
Iterator used to iterate through an term_appl.
bool operator==(const unprotected_aterm_core &t) const
Comparison operator.
bool operator!=(const unprotected_aterm_core &t) const
Inequality operator on two unprotected aterms.
parse_node_unexpected_exception(const parser &p, const parse_node &node)
\brief Assignment of a data expression to a variable
const data_expression & rhs() const
const variable & lhs() const
data_expression & operator=(const data_expression &) noexcept=default
data_expression & operator=(data_expression &&) noexcept=default
sort_expression sort() const
Returns the sort of the data expression.
data_expression(const data_expression &) noexcept=default
Move semantics.
void translate_user_notation()
Translate user notation within the equations of the data specification.
data_specification()
Default constructor. Generate a data specification that contains only booleans and positive numbers.
Rewriter that operates on data expressions.
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
const sort_expression & sort() const
logger(const log_level_t l)
Default constructor.
action_rename_rule()
Constructor.
const data::data_expression & condition() const
Returns the condition of the rule.
const process::process_expression & rhs() const
Returns the right hand side of the rule.
data::data_expression & condition()
Returns the condition of the rule.
action_rename_rule(const data::variable_list &variables, const data::data_expression &condition, const process::action &lhs, const process::process_expression &rhs)
Constructor.
process::process_expression m_rhs
right hand side of the rule. Can only be an action, tau or delta.
data::variable_list m_variables
The data variables of the rule.
bool check_that_rhs_is_tau_delta_or_an_action() const
data::variable_list & variables()
Returns the variables of the rule.
process::action m_lhs
The left hand side of the rule.
action_rename_rule(const atermpp::aterm &t)
Constructor.
data::data_expression m_condition
The condition of the rule.
const data::variable_list & variables() const
Returns the variables of the rule.
const process::action & lhs() const
Returns the left hand side of the rule.
Read-only singly linked list of action rename rules.
action_rename_specification()
Constructor.
const std::vector< action_rename_rule > & rules() const
Returns the action rename rules.
data::data_specification m_data
The data specification of the action rename specification.
process::action_label_list & action_labels()
Returns the sequence of action labels.
std::vector< action_rename_rule > m_rules
The action rename rules of the action rename specification.
action_rename_specification(const data::data_specification &data, const process::action_label_list &action_labels, const std::vector< action_rename_rule > &rules)
Constructor.
std::vector< action_rename_rule > & rules()
Returns the action rename rules.
process::action_label_list m_action_labels
The action labels of the action rename specification.
const process::action_label_list & action_labels() const
Returns the sequence of action labels.
action_rename_specification(atermpp::aterm t)
Constructor.
bool is_well_typed() const
Indicates whether the action_rename_specification is well typed.
action_rename_specification operator()(const action_rename_specification &arspec, const stochastic_specification &lpsspec)
Type check an action_rename_specification.
process::detail::action_context m_action_context
action_rename_rule typecheck_action_rename_rule(const action_rename_rule &x, const process::action_label_list &action_labels)
data::data_type_checker m_data_type_checker
action_rename_type_checker()
Default constructor for an action rename type checker.
LPS summand containing a multi-action.
data::data_expression_list next_state(const data::variable_list &process_parameters) const
Returns the next state corresponding to this summand.
const data::assignment_list & assignments() const
Returns the sequence of assignments.
LPS summand containing a deadlock.
deadlock(data::data_expression time=data::undefined_real())
Constructor.
bool has_time() const
Returns true if time is available.
const data::data_expression & time() const
Returns the time.
data::data_expression & time()
Returns the time.
linear_process(const data::variable_list &process_parameters, const deadlock_summand_vector &deadlock_summands, const action_summand_vector &action_summands)
Constructor.
multi_action_type_checker(const data::data_specification &dataspec=data::data_specification())
Default constructor.
multi_action operator()(const process::untyped_multi_action &x)
Type check a multi action. Throws a mcrl2::runtime_error exception if the expression is not well type...
data::detail::variable_context m_variable_context
process::detail::action_context m_action_context
data::data_type_checker m_data_type_checker
multi_action_type_checker(const data::data_specification &dataspec, const VariableContainer &variables, const ActionLabelContainer &action_labels)
\brief A timed multi-action
bool has_time() const
Returns true if time is available.
const process::action_list & actions() const
multi_action(const process::action &l)
Constructor.
multi_action operator+(const multi_action &other) const
Joins the actions of both multi actions.
multi_action & operator=(multi_action &&) noexcept=default
const data::data_expression & time() const
multi_action(const process::action_list &actions=process::action_list(), data::data_expression time=data::undefined_real())
Constructor.
process_initializer & operator=(process_initializer &&) noexcept=default
Linear process specification.
LPS summand containing a multi-action.
\brief A stochastic distribution
stochastic_distribution & operator=(stochastic_distribution &&) noexcept=default
stochastic_distribution()
\brief Default constructor X3.
stochastic_distribution(const data::variable_list &variables, const data::data_expression &distribution)
\brief Constructor Z12.
stochastic_linear_process(const data::variable_list &process_parameters, const deadlock_summand_vector &deadlock_summands, const stochastic_action_summand_vector &action_summands)
Constructor.
A stochastic process initializer.
stochastic_process_initializer(const data::data_expression_list &expressions, const stochastic_distribution &distribution)
Constructor.
Linear process specification.
const data::sort_expression_list & sorts() const
const core::identifier_string & name() const
action(const action_label &label, const data::data_expression_list &arguments)
\brief Constructor Z14.
const data::data_expression_list & arguments() const
action(const action &) noexcept=default
Move semantics.
const action_label & label() const
\brief The allow operator
const data::data_expression & time_stamp() const
const process_expression & operand() const
\brief The block operator
\brief The bounded initialization
\brief The choice operator
const process_expression & left() const
const process_expression & right() const
\brief The communication operator
delta()
\brief Default constructor X3.
\brief The if-then-else operator
\brief The if-then operator
const process_expression & then_case() const
const data::data_expression & condition() const
\brief The left merge operator
\brief The merge operator
\brief A process equation
process_equation()
\brief Default constructor X3.
process_equation(const process_equation &) noexcept=default
Move semantics.
const data::variable_list & formal_parameters() const
const process_identifier & identifier() const
const process_expression & expression() const
\brief A process expression
process_expression(const process_expression &) noexcept=default
Move semantics.
\brief A process assignment
const process_identifier & identifier() const
const data::data_expression_list & actual_parameters() const
const process_identifier & identifier() const
Process specification consisting of a data specification, action labels, a sequence of process equati...
const process_expression & init() const
Returns the initialization of the process specification.
const process::action_label_list & action_labels() const
Returns the action label specification.
\brief The rename operator
\brief The sequential composition
const process_expression & right() const
const process_expression & left() const
\brief The distribution operator
const data::variable_list & variables() const
const data::data_expression & distribution() const
const process_expression & operand() const
const data::variable_list & variables() const
\brief The synchronization operator
const process_expression & left() const
const process_expression & right() const
tau()
\brief Default constructor X3.
\brief An untyped multi action or data application
untyped_multi_action()
\brief Default constructor X3.
Standard exception class for reporting runtime errors.
runtime_error(const std::string &message)
Constructor.
D_ParserTables parser_tables_mcrl2
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
The main namespace for the aterm++ library.
term_list< aterm > aterm_list
A term_list with elements of type aterm.
void syntax_error_fn(struct D_Parser *ap)
Custom syntax error function that prints both the line number and the column.
D_ParseNode * ambiguity_fn(struct D_Parser *, int n, struct D_ParseNode **v)
Function for resolving parser ambiguities.
const atermpp::function_symbol & function_symbol_ActionRenameRule()
bool sequence_empty_intersection(Sequence s1, Sequence s2)
Determines if the unordered sequences s1 and s2 have an empty intersection.
bool sequence_contains_duplicates(Iterator first, Iterator last)
Returns true if the sequence [first, last) contains duplicates.
static data_specification const & default_specification()
bool sequence_is_subset_of_set(Iterator first, Iterator last, const std::set< T > &s)
Returns true if all elements of the range [first, last) are element of the set s.
bool check_assignment_variables(assignment_list const &assignments, variable_list const &variables)
Returns true if the left hand sides of assignments are contained in variables.
bool sequences_do_overlap(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2)
Returns true if the two sequences [first1, last1) and [first2, last2) have a non empty intersection.
std::set< typename Container::value_type > make_set(const Container &c)
Makes a set of the given container.
Namespace for system defined sort bool_.
bool is_bool(const sort_expression &e)
Recogniser for sort expression Bool.
bool is_and_application(const atermpp::aterm &e)
Recogniser for application of &&.
bool is_not_application(const atermpp::aterm &e)
Recogniser for application of !.
const function_symbol & true_()
Constructor for function symbol true.
Namespace for system defined sort real_.
bool is_real(const sort_expression &e)
Recogniser for sort expression Real.
Namespace for all data library functionality.
atermpp::term_list< data_expression > data_expression_list
\brief list of data_expressions
atermpp::term_list< variable > variable_list
\brief list of variables
atermpp::term_list< assignment > assignment_list
\brief list of assignments
std::string pp(const data::variable_list &x)
std::string pp(const data::data_expression &x)
bool is_well_typed(const T &x)
Checks well typedness of an LPS object.
bool check_action_labels(const process::action_list &actions, const std::set< process::action_label > &labels)
Returns true if the labels of the given actions are contained in labels.
multi_action complete_multi_action(process::untyped_multi_action &x, const process::action_label_list &action_decls, const data::data_specification &data_spec=data::detail::default_specification())
process::action_label rename_action_label(const process::action_label &act, const std::regex &matching_regex, const std::string &replacing_fmt)
bool check_action_label_sorts(const process::action_label_list &action_labels, const std::set< data::sort_expression > &sorts)
Returns true if the sorts of the given action labels are contained in sorts.
bool check_well_typedness(const T &x)
Checks well typedness of an LPS object, and will print error messages to stderr.
bool check_action_sorts(const process::action_list &actions, const std::set< data::sort_expression > &sorts)
Returns true if the sorts of the given actions are contained in sorts.
void complete_action_rename_specification(action_rename_specification &x, const lps::stochastic_specification &spec)
process::untyped_multi_action parse_multi_action_new(const std::string &text)
multi_action complete_multi_action(process::untyped_multi_action &x, multi_action_type_checker &typechecker, const data::data_specification &data_spec=data::detail::default_specification())
action_rename_specification parse_action_rename_specification_new(const std::string &text)
The main namespace for the LPS library.
std::string pp(const lps::stochastic_process_initializer &x)
std::string pp(const lps::stochastic_distribution &x)
std::set< data::variable > find_all_variables(const lps::linear_process &x)
std::set< data::sort_expression > find_sort_expressions(const lps::stochastic_specification &x)
std::set< process::action_label > find_action_labels(const lps::stochastic_specification &x)
std::set< data::variable > find_free_variables(const lps::stochastic_specification &x)
std::vector< stochastic_action_summand > stochastic_action_summand_vector
\brief vector of stochastic_action_summands
std::string pp_with_summand_numbers(const specification &x)
std::string pp(const lps::process_initializer &x)
std::set< data::variable > find_all_variables(const lps::stochastic_specification &x)
bool check_well_typedness(const specification &x)
std::set< data::variable > find_free_variables(const lps::linear_process &x)
std::string pp(const lps::stochastic_specification &x)
bool check_well_typedness(const linear_process &x)
std::set< data::function_symbol > find_function_symbols(const lps::stochastic_specification &x)
std::string pp(const lps::linear_process &x)
std::vector< deadlock_summand > deadlock_summand_vector
\brief vector of deadlock_summands
lps::stochastic_specification action_rename(const action_rename_specification &action_rename_spec, const lps::stochastic_specification &lps_old_spec, const data::rewriter &rewr, const bool enable_rewriting)
Rename the actions in a linear specification using a given action_rename_spec.
std::string pp(const lps::deadlock &x)
std::set< process::action_label > find_action_labels(const lps::process_initializer &x)
std::string pp(const lps::multi_action &x)
std::set< data::variable > find_free_variables(const lps::specification &x)
multi_action typecheck_multi_action(process::untyped_multi_action &mult_act, const data::data_specification &data_spec, const process::action_label_list &action_decls)
Type check a multi action Throws an exception if something went wrong.
std::string pp(const lps::specification &x)
void normalize_sorts(lps::specification &x, const data::sort_specification &)
std::set< data::variable > find_free_variables(const lps::deadlock &x)
std::set< process::action_label > find_action_labels(const lps::linear_process &x)
lps::multi_action normalize_sorts(const lps::multi_action &x, const data::sort_specification &sortspec)
std::set< data::variable > find_free_variables(const lps::stochastic_linear_process &x)
multi_action typecheck_multi_action(process::untyped_multi_action &mult_act, multi_action_type_checker &typechecker)
Type check a multi action Throws an exception if something went wrong.
std::set< data::function_symbol > find_function_symbols(const lps::specification &x)
std::set< data::variable > find_free_variables(const lps::stochastic_process_initializer &x)
void normalize_sorts(T &x, const data::sort_specification &sortspec, typename std::enable_if< !std::is_base_of< atermpp::aterm, T >::value >::type *=nullptr)
std::set< data::variable > find_free_variables(const lps::multi_action &x)
std::string pp(const lps::deadlock_summand &x)
void normalize_sorts(lps::stochastic_specification &x, const data::sort_specification &)
std::set< data::variable > find_free_variables(const lps::process_initializer &x)
std::string pp(const lps::stochastic_linear_process &x)
atermpp::aterm action_rename_specification_to_aterm(const action_rename_specification &spec)
atermpp::aterm action_rename_rule_to_aterm(const action_rename_rule &rule)
std::set< data::variable > find_all_variables(const lps::multi_action &x)
T normalize_sorts(const T &x, const data::sort_specification &sortspec, typename std::enable_if< std::is_base_of< atermpp::aterm, T >::value >::type *=0)
std::set< data::sort_expression > find_sort_expressions(const lps::specification &x)
std::vector< action_summand > action_summand_vector
\brief vector of action_summands
std::string pp(const lps::stochastic_action_summand &x)
std::set< data::variable > find_all_variables(const lps::specification &x)
stochastic_specification action_rename(const std::regex &matching_regex, const std::string &replacing_fmt, const stochastic_specification &lps_old_spec)
Rename actions in given specification based on a regular expression and a string that specifies how t...
bool check_well_typedness(const stochastic_specification &x)
std::set< data::variable > find_all_variables(const lps::deadlock &x)
action_rename_specification typecheck_action_rename_specification(const action_rename_specification &arspec, const lps::stochastic_specification &lpsspec)
Type checks an action rename specification.
std::set< data::variable > find_all_variables(const lps::stochastic_linear_process &x)
bool check_well_typedness(const stochastic_linear_process &x)
lps::multi_action translate_user_notation(const lps::multi_action &x)
std::set< core::identifier_string > find_identifiers(const lps::stochastic_specification &x)
std::string pp(const lps::action_summand &x)
std::set< core::identifier_string > find_identifiers(const lps::specification &x)
std::string pp_with_summand_numbers(const stochastic_specification &x)
std::set< process::action_label > find_action_labels(const lps::specification &x)
bool check_process_instance_assignment(const process_equation &eq, const process_instance_assignment &inst)
Returns true if the process instance assignment a matches with the process equation eq.
bool is_process(const process_expression &x)
Returns true if the argument is a process instance.
bool is_conditional_deadlock(const process_expression &x)
Returns true if the argument is a conditional deadlock.
bool is_linear_process_term(const process_expression &x)
Returns true if the argument is a linear process.
bool check_process_instance(const process_equation &eq, const process_instance &init)
Returns true if the process instance a matches with the process equation eq.
bool is_alternative(const process_expression &x)
Returns true if the argument is an alternative composition.
bool is_timed_deadlock(const process_expression &x)
Returns true if the argument is a deadlock.
bool is_action_prefix(const process_expression &x)
Returns true if the argument is an action prefix.
bool is_stochastic_process(const process_expression &x)
Returns true if the argument is a process instance, optionally wrapped in a stochastic distribution.
bool is_multiaction(const process_expression &x)
Returns true if the argument is a multi-action.
bool is_conditional_action_prefix(const process_expression &x)
Returns true if the argument is a conditional action prefix.
bool is_timed_multiaction(const process_expression &x)
Returns true if the argument is a multi-action.
The main namespace for the Process library.
bool is_at(const atermpp::aterm &x)
bool is_linear(const process_specification &p, bool verbose=false)
Returns true if the process specification is linear.
std::string pp(const process::comm &x)
std::string pp(const process::untyped_multi_action &x)
bool is_linear(const process_expression &x, const process_equation &eqn)
Returns true if the process expression is linear.
bool is_process_instance(const atermpp::aterm &x)
std::string pp(const process::block &x)
bool is_process_instance_assignment(const atermpp::aterm &x)
bool is_tau(const atermpp::aterm &x)
std::string pp(const process::process_instance &x)
bool is_seq(const atermpp::aterm &x)
std::string pp(const process::process_instance_assignment &x)
bool is_delta(const atermpp::aterm &x)
bool is_linear(const process_equation &eqn)
Returns true if the process equation is linear.
bool is_sum(const atermpp::aterm &x)
bool is_action(const atermpp::aterm &x)
std::string pp(const process::left_merge &x)
std::string pp(const process::hide &x)
atermpp::term_list< action_label > action_label_list
\brief list of action_labels
std::string pp(const process::allow &x)
std::string pp(const process::if_then_else &x)
atermpp::term_list< action > action_list
\brief list of actions
std::string pp(const process::rename &x)
std::string pp(const process::process_expression &x)
bool is_if_then(const atermpp::aterm &x)
std::string pp(const process::merge &x)
std::string pp(const process::bounded_init &x)
bool is_choice(const atermpp::aterm &x)
bool is_stochastic_operator(const atermpp::aterm &x)
std::string pp(const process::if_then &x)
bool is_sync(const atermpp::aterm &x)
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
core::identifier_string parse_Id(const parse_node &node) const
parse_node child(int i) const
std::string symbol_name(const parse_node &node) const
Wrapper for D_Parser and its corresponding D_ParserTables.
parse_node parse(const std::string &text, unsigned int start_symbol_index=0, bool partial_parses=false)
Parses a string. N.B. The user is responsible for destruction of the returned value by calling destro...
parser(D_ParserTables &tables, D_AmbiguityFn ambiguity_fn=nullptr, D_SyntaxErrorFn syntax_error_fn=nullptr, std::size_t max_error_message_count=1)
unsigned int start_symbol_index(const std::string &name) const
Substitution that maps data variables to data expressions. The substitution is stored as an assignmen...
assignment_sequence_substitution(const assignment_list &assignments_)
data::data_expression parse_DataExpr(const core::parse_node &node) const
bool callback_DataSpecElement(const core::parse_node &node, untyped_data_specification &result) const
normalize_sorts_function(const sort_specification &sort_spec)
data_specification construct_data_specification() const
std::vector< lps::action_rename_rule > parse_ActionRenameRuleList(const core::parse_node &node) const
process::action parse_Action_as_action(const core::parse_node &node) const
bool callback_ActionRenameSpec(const core::parse_node &node, data::untyped_data_specification &dataspec_result, lps::action_rename_specification &result) const
std::vector< lps::action_rename_rule > parse_ActionRenameRuleSpec(const core::parse_node &node) const
lps::action_rename_specification parse_ActionRenameSpec(const core::parse_node &node) const
process::process_expression parse_ActionRenameRuleRHS(const core::parse_node &node) const
action_rename_actions(const core::parser &parser_)
lps::action_rename_rule parse_ActionRenameRule(const core::parse_node &node) const
Function object for applying a substitution to LPS data types.
bool is_well_typed(const linear_process_base< ActionSummand > &p) const
Checks well typedness of a linear process.
bool is_well_typed(const process::action &a) const
Traverses an action.
bool is_well_typed(const action_summand &s) const
Checks well typedness of a summand.
bool check_time(const data::data_expression &t, const std::string &type) const
Checks if the sort of t has type real.
bool is_well_typed(const data::assignment &a) const
Traverses an assignment.
bool check_condition(const data::data_expression &t, const std::string &type) const
Checks if the sort of t has type bool.
bool operator()(const Term &t) const
bool is_well_typed(const stochastic_specification &spec) const
bool is_well_typed(const data::variable &d) const
Checks well typedness of a variable.
bool check_assignments(const data::assignment_list &l, const std::string &type) const
Checks if the assignments are well typed and have unique left hand sides.
bool is_well_typed(const specification &spec) const
bool is_well_typed(const data::sort_expression &d) const
Checks well typedness of a sort expression.
bool is_well_typed_container(const Container &c) const
Checks well typedness of the elements of a container.
bool is_well_typed(const process::action_label &d) const
Traverses an action label.
bool is_well_typed(const specification_base< LinearProcess, InitialProcessExpression > &spec, const std::set< data::variable > &free_variables) const
Checks well typedness of a linear process specification.
bool is_well_typed(const deadlock &d) const
Checks well typedness of a deadlock.
bool is_well_typed(const data::data_expression &d) const
Checks well typedness of a data expression.
bool is_well_typed(const deadlock_summand &s) const
Checks well typedness of a summand.
bool is_well_typed(const multi_action &a) const
Checks well typedness of a multi-action.
process::untyped_multi_action parse_MultAct(const core::parse_node &node) const
multi_action_actions(const core::parser &parser_)
action_actions(const core::parser &parser_)
Exception that is thrown to denote that the process is not linear.
non_linear_process(const process_expression &p)
Converts a process expression into linear process format. Use the convert member functions for this.
void leave(const process::merge &x)
Visit merge node.
process_expression_traverser< linear_process_conversion_traverser > super
data::data_expression m_condition
Contains intermediary results.
void leave(const process::action &x)
Visit action node.
void leave(const process::at &x)
Visit at node.
void apply(const process::seq &x)
Visit seq node.
bool m_deadlock_changed
True if m_deadlock was changed.
void leave(const process::block &x)
Visit block node.
lps::deadlock_summand_vector m_deadlock_summands
The result of the conversion.
void leave(const process::rename &x)
Visit rename node.
process_equation m_equation
The process equation that is checked.
void leave(const process::tau &)
Visit tau node.
void leave(const delta &)
Visit delta node.
void clear_summand()
Clears the current summand.
lps::specification convert(const process_specification &p)
Converts a process_specification into a specification. Throws non_linear_process if a non-linear sub-...
void apply(const process::choice &x)
Visit choice node.
void leave(const process::comm &x)
Visit comm node.
bool m_multi_action_changed
True if m_multi_action was changed.
bool m_next_state_changed
True if m_next_state was changed.
void leave(const process::hide &x)
Visit hide node.
void leave(const process::left_merge &x)
Visit left_merge node.
data::assignment_list m_next_state
Contains intermediary results.
lps::action_summand_vector m_action_summands
The result of the conversion.
void apply(const process::sync &x)
Visit sync node.
void leave(const process::if_then &x)
Visit if_then node.
lps::deadlock m_deadlock
Contains intermediary results.
void leave(const process::bounded_init &x)
Visit bounded_init node.
void leave(const process::allow &x)
Visit allow node.
void add_summand()
Adds a summand to the result.
lps::multi_action m_multi_action
Contains intermediary results.
void convert(const process_equation &)
Returns true if the process equation e is linear.
data::variable_list m_sum_variables
Contains intermediary results.
void leave(const process::if_then_else &x)
Visit if_then_else node.
void leave(const process::sum &x)
Visit sum node.
Exception that is thrown by linear_process_expression_traverser.
non_linear_process_error(const std::string &msg)
Checks if a process equation is linear. Use the is_linear() member function for this.
void enter(const process::sync &x)
void enter(const process::merge &x)
void enter(const process::allow &x)
process_expression_traverser< linear_process_expression_traverser > super
void enter(const process::at &x)
void enter(const process::left_merge &x)
void enter(const process::comm &x)
void enter(const process::rename &x)
void enter(const process::seq &x)
void enter(const process::bounded_init &x)
linear_process_expression_traverser(const process_equation &eqn_=process_equation())
void enter(const process::process_instance &x)
void enter(const process::block &x)
process_equation eqn
The process equation that is checked.
void enter(const process::if_then_else &x)
bool is_linear(const process_expression &x, bool verbose=false)
Returns true if the process equation e is linear.
void enter(const process::if_then &x)
void enter(const process::process_instance_assignment &x)
void enter(const process::hide &x)
void enter(const process::sum &x)
Exception that is thrown to denote that the process is not linear.
non_linear_process(const process_expression &p)
Converts a process expression into linear process format. Use the convert member functions for this.
lps::deadlock m_deadlock
Contains intermediary results.
void leave(const process::stochastic_operator &x)
Visit stochastic operator node.
void apply(const process::seq &x)
Visit seq node.
void add_summand()
Adds a summand to the result.
void leave(const process::action &x)
Visit action node.
bool m_deadlock_changed
True if m_deadlock was changed.
void convert(const process_equation &)
Returns true if the process equation e is linear.
void leave(const process::rename &x)
Visit rename node.
void leave(const process::if_then &x)
Visit if_then node.
void leave(const process::allow &x)
Visit allow node.
data::data_expression m_condition
Contains intermediary results.
void leave(const process::at &x)
Visit at node.
bool m_next_state_changed
True if m_next_state was changed.
data::variable_list m_sum_variables
Contains intermediary results.
lps::stochastic_action_summand_vector m_action_summands
The result of the conversion.
lps::deadlock_summand_vector m_deadlock_summands
The result of the conversion.
void leave(const process::block &x)
Visit block node.
void leave(const process::merge &x)
Visit merge node.
lps::multi_action m_multi_action
Contains intermediary results.
void leave(const process::tau &)
Visit tau node.
bool m_multi_action_changed
True if m_multi_action was changed.
void leave(const process::sum &x)
Visit sum node.
data::assignment_list m_next_state
Contains intermediary results.
void leave(const delta &)
Visit delta node.
void apply(const process::choice &x)
Visit choice node.
void leave(const process::if_then_else &x)
Visit if_then_else node.
void leave(const process::left_merge &x)
Visit left_merge node.
void apply(const process::sync &x)
Visit sync node.
void leave(const process::comm &x)
Visit comm node.
process_equation m_equation
The process equation that is checked.
lps::stochastic_distribution m_distribution
Contains intermediary results.
void clear_summand()
Clears the current summand.
void leave(const process::bounded_init &x)
Visit bounded_init node.
process_expression_traverser< stochastic_linear_process_conversion_traverser > super
lps::stochastic_specification convert(const process_specification &p)
Converts a process_specification into a stochastic_specification. Throws non_linear_process if a non-...
void leave(const process::hide &x)
Visit hide node.
std::size_t operator()(const atermpp::detail::reference_aterm< T > &t) const