12#ifndef MCRL2_LPS_DETAIL_LINEAR_PROCESS_CONVERSION_TRAVERSER_H
13#define MCRL2_LPS_DETAIL_LINEAR_PROCESS_CONVERSION_TRAVERSER_H
15#include "mcrl2/lps/stochastic_specification.h"
16#include "mcrl2/process/is_linear.h"
78 m_sum_variables = data::variable_list();
84 m_next_state = data::assignment_list();
95 m_action_summands.emplace_back(m_sum_variables, m_condition, m_multi_action, m_next_state);
96 mCRL2log(log::debug) <<
"adding action summand\n" << m_action_summands.back() << std::endl;
101 throw mcrl2::runtime_error(
"Error in linear_process_conversion_traverser::convert: encountered a multi action without process reference");
106 m_deadlock_summands.emplace_back(m_sum_variables, m_condition, m_deadlock);
107 mCRL2log(log::debug) <<
"adding deadlock summand\n" << m_deadlock_summands.back() << std::endl;
119 mCRL2log(log::debug) <<
"adding deadlock\n" << m_deadlock << std::endl;
129 mCRL2log(log::debug) <<
"adding multi action tau\n" << m_multi_action << std::endl;
142 mCRL2log(log::debug) <<
"adding multi action\n" << m_multi_action << std::endl;
152 m_sum_variables = m_sum_variables + x.variables();
153 mCRL2log(log::debug) <<
"adding sum variables\n" << data::pp(x.variables()) << std::endl;
219 mCRL2log(log::debug) <<
"adding multi action\n" << m_multi_action << std::endl;
232 mCRL2log(log::debug) <<
"adding deadlock\n" << m_deadlock << std::endl;
237 mCRL2log(log::debug) <<
"adding multi action\n" << m_multi_action << std::endl;
253 const process_instance& p = atermpp::down_cast<process_instance>(x.right());
257 std::clog <<
"seq right hand side: " << process::pp(x.right()) << std::endl;
258 throw mcrl2::runtime_error(
"Error in linear_process_conversion_traverser::convert: seq expression encountered that does not match the process equation");
260 m_next_state = data::make_assignment_list(m_equation.formal_parameters(), p.actual_parameters());
269 std::clog <<
"seq right hand side: " << process::pp(x.right()) << std::endl;
270 throw mcrl2::runtime_error(
"Error in linear_process_conversion_traverser::convert: seq expression encountered that does not match the process equation");
272 m_next_state = p.assignments();
277 std::clog <<
"seq right hand side: " << process::pp(x.right()) << std::endl;
278 throw mcrl2::runtime_error(
"Error in linear_process_conversion_traverser::convert: seq expression encountered with an unexpected right hand side");
281 mCRL2log(log::debug) <<
"adding next state\n" << data::pp(m_next_state) << std::endl;
292 mCRL2log(log::debug) <<
"adding condition\n" << data::pp(m_condition) << std::endl;
375 m_action_summands.clear();
376 m_deadlock_summands.clear();
379 if (p.equations().size() != 1)
381 throw mcrl2::runtime_error(
"Error in linear_process_conversion_traverser::convert: the number of process equations is not equal to 1!");
389 const process_instance& init = atermpp::down_cast<process_instance>(p.init());
392 throw mcrl2::runtime_error(
"Error in linear_process_conversion_traverser::convert: the initial process does not match the process equation");
401 throw mcrl2::runtime_error(
"Error in linear_process_conversion_traverser::convert: the initial process does not match the process equation");
403 proc_init = lps::process_initializer(data::right_hand_sides(init.assignments()));
407 throw mcrl2::runtime_error(
"Error in linear_process_conversion_traverser::convert: the initial process has an unexpected value");
413 lps::
linear_process proc(m_equation.formal_parameters(), m_deadlock_summands, m_action_summands);
476 m_sum_variables = data::variable_list();
483 m_next_state = data::assignment_list();
494 m_action_summands.emplace_back(m_sum_variables, m_condition, m_multi_action, m_next_state, m_distribution);
495 mCRL2log(log::debug) <<
"adding action summand\n" << m_action_summands.back() << std::endl;
500 throw mcrl2::runtime_error(
"Error in stochastic_linear_process_conversion_traverser::convert: encountered a multi action without process reference");
505 m_deadlock_summands.emplace_back(m_sum_variables, m_condition, m_deadlock);
506 mCRL2log(log::debug) <<
"adding deadlock summand\n" << m_deadlock_summands.back() << std::endl;
518 mCRL2log(log::debug) <<
"adding deadlock\n" << m_deadlock << std::endl;
528 mCRL2log(log::debug) <<
"adding multi action tau\n" << m_multi_action << std::endl;
541 mCRL2log(log::debug) <<
"adding multi action\n" << m_multi_action << std::endl;
551 m_sum_variables = m_sum_variables + x.variables();
552 mCRL2log(log::debug) <<
"adding sum variables\n" << data::pp(x.variables()) << std::endl;
618 mCRL2log(log::debug) <<
"adding multi action\n" << m_multi_action << std::endl;
631 mCRL2log(log::debug) <<
"adding deadlock\n" << m_deadlock << std::endl;
636 mCRL2log(log::debug) <<
"adding multi action\n" << m_multi_action << std::endl;
652 auto const& op = atermpp::down_cast<stochastic_operator>(right);
653 m_distribution = lps::stochastic_distribution(op.variables(), op.distribution());
654 right = op.operand();
664 std::clog <<
"seq right hand side: " << process::pp(right) << std::endl;
665 throw mcrl2::runtime_error(
"Error in linear_process_conversion_traverser::convert: seq expression encountered that does not match the process equation");
667 m_next_state = data::make_assignment_list(m_equation.formal_parameters(), p.actual_parameters());
676 std::clog <<
"seq right hand side: " << process::pp(right) << std::endl;
677 throw mcrl2::runtime_error(
"Error in linear_process_conversion_traverser::convert: seq expression encountered that does not match the process equation");
679 m_next_state = p.assignments();
684 std::clog <<
"seq right hand side: " << process::pp(right) << std::endl;
685 throw mcrl2::runtime_error(
"Error in linear_process_conversion_traverser::convert: seq expression encountered with an unexpected right hand side");
688 mCRL2log(log::debug) <<
"adding next state\n" << data::pp(m_next_state) << std::endl;
699 mCRL2log(log::debug) <<
"adding condition\n" << data::pp(m_condition) << std::endl;
783 m_action_summands.clear();
784 m_deadlock_summands.clear();
787 if (p.equations().size() != 1)
789 throw mcrl2::runtime_error(
"Error in stochastic_linear_process_conversion_traverser::convert: the number of process equations is not equal to 1!");
800 auto const& s = atermpp::down_cast<stochastic_operator>(p.init());
801 dist = lps::stochastic_distribution(s.variables(), s.distribution());
802 p_init = s.operand();
806 const process_instance& init = atermpp::down_cast<process_instance>(p_init);
809 throw mcrl2::runtime_error(
"Error in stochastic_linear_process_conversion_traverser::convert: the initial process does not match the process equation");
818 throw mcrl2::runtime_error(
"Error in stochastic_linear_process_conversion_traverser::convert: the initial process does not match the process equation");
820 proc_init = lps::stochastic_process_initializer(data::right_hand_sides(init.assignments()), dist);
824 throw mcrl2::runtime_error(
"Error in stochastic_linear_process_conversion_traverser::convert: the initial process has an unexpected value");
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.
const sort_expression & sort() const
action_rename_rule(const data::variable_list &variables, const data::data_expression &condition, const process::action &lhs, const process::process_expression &rhs)
Constructor.
Action rename specification.
process::action_label_list & action_labels()
Returns the sequence of action labels.
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.
LPS summand containing a deadlock.
deadlock(data::data_expression time=data::undefined_real())
Constructor.
bool has_time() const
Returns true if time is available.
data::data_expression & time()
Returns the time.
\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
multi_action(const process::action_list &actions=process::action_list(), data::data_expression time=data::undefined_real())
Constructor. Actions are sorted to establish the sorted-storage invariant.
process_initializer & operator=(process_initializer &&) noexcept=default
process_initializer(const data::data_expression_list &expressions)
Constructor.
Linear process specification.
\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.
A stochastic process initializer.
stochastic_process_initializer(const data::data_expression_list &expressions, const stochastic_distribution &distribution)
Constructor.
Linear process specification.
action(const action_label &label, const data::data_expression_list &arguments)
\brief Constructor Z14.
const data::data_expression_list & arguments() const
const action_label & label() const
\brief The allow operator
const data::data_expression & time_stamp() 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 data::data_expression & condition() const
\brief The left merge operator
\brief The merge operator
\brief A process equation
const process_expression & expression() const
\brief A process expression
process_expression(const process_expression &) noexcept=default
Move semantics.
\brief A process assignment
const data::data_expression_list & actual_parameters() 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
\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.
D_ParserTables parser_tables_mcrl2
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
static data_specification const & default_specification()
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.
Namespace for system defined sort bool_.
bool is_bool(const sort_expression &e)
Recogniser for sort expression Bool.
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.
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
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())
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_specification &x, bool arg0)
std::set< data::variable > find_all_variables(const lps::linear_process &x)
std::string pp(const lps::specification &x, bool arg0)
std::set< data::sort_expression > find_sort_expressions(const lps::stochastic_specification &x)
std::string pp_extended(const lps::stochastic_specification &x, const std::string &process_name, bool precedence_aware=true)
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::string pp(const lps::stochastic_distribution &x, bool arg0)
std::string pp_extended(const stochastic_specification &x, const std::string &process_name, bool precedence_aware, bool summand_numbers)
std::set< data::variable > find_all_variables(const lps::multi_action &x)
Returns all variables inside a multi-action.
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)
bool check_well_typedness(const linear_process &x)
std::set< data::function_symbol > find_function_symbols(const lps::stochastic_specification &x)
std::string pp_extended(const specification &x, const std::string &process_name, bool precedence_aware, bool summand_numbers)
std::set< process::action_label > find_action_labels(const lps::process_initializer &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.
void normalize_sorts(lps::specification &x, const data::sort_specification &)
std::set< data::variable > find_free_variables(const lps::deadlock &x)
std::string pp(const lps::deadlock_summand &x, bool arg0)
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::string pp(const lps::stochastic_linear_process &x, bool arg0)
std::set< data::variable > find_free_variables(const lps::stochastic_process_initializer &x)
std::set< data::variable > find_free_variables(const lps::multi_action &x)
std::string pp(const lps::deadlock &x, bool arg0)
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_action_summand &x, bool arg0)
std::string pp(const lps::stochastic_process_initializer &x, bool arg0)
std::string pp(const lps::linear_process &x, bool arg0)
std::string pp(const lps::multi_action &x, bool arg0)
std::set< data::sort_expression > find_sort_expressions(const lps::specification &x)
std::string pp(const lps::action_summand &x, bool arg0)
std::set< data::variable > find_all_variables(const lps::specification &x)
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::set< core::identifier_string > find_identifiers(const lps::specification &x)
std::set< process::action_label > find_action_labels(const lps::specification &x)
std::string pp(const lps::process_initializer &x, bool arg0)
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 check_process_instance(const process_equation &eq, const process_instance &init)
Returns true if the process instance a matches with the process equation eq.
The main namespace for the Process library.
bool is_process_instance(const atermpp::aterm &x)
bool is_process_instance_assignment(const atermpp::aterm &x)
bool is_delta(const atermpp::aterm &x)
bool is_choice(const atermpp::aterm &x)
bool is_stochastic_operator(const atermpp::aterm &x)
core::identifier_string parse_Id(const parse_node &node) const
data::data_expression parse_DataExpr(const core::parse_node &node) const
bool callback_DataSpecElement(const core::parse_node &node, untyped_data_specification &result) const
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.
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 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.
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.