mCRL2
Loading...
Searching...
No Matches
linearise_communication.h
Go to the documentation of this file.
1// Author(s): Jan Friso Groote, Jeroen Keiren
2// Copyright: see the accompanying file COPYING or copy at
3// https://github.com/mCRL2org/mCRL2/blob/master/COPYING
4//
5// Distributed under the Boost Software License, Version 1.0.
6// (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8//
9/// \file mcrl2/lps/linearise_communication.h
10/// \brief Apply the rename operator to action summands.
11
12#ifndef MCRL2_LPS_LINEARISE_COMMUNICATION_H
13#define MCRL2_LPS_LINEARISE_COMMUNICATION_H
14
15#include "mcrl2/atermpp/aterm_list.h"
16#include "mcrl2/core/detail/print_utility.h"
17#include "mcrl2/lps/detail/configuration.h"
18#include "mcrl2/lps/linearise_allow_block.h"
19#include "mcrl2/lps/linearise_utility.h"
20#include "mcrl2/lps/stochastic_action_summand.h"
21#include "mcrl2/lps/sumelm.h"
22#include "mcrl2/process/action_label.h"
23#include "mcrl2/process/process_expression.h"
24
25#include <optional>
26
27namespace mcrl2::lps
28{
29
30namespace detail
31{
32
33/// Get a sorted list of action names that appear in any of the elements of allowlist
34/// The result does not contain duplicates.
35/// We use this to remove possible communication results that are not relevant because they
36/// are guaranteed to be removed from the result after the fact.
38{
39 std::vector<core::identifier_string> result;
40 for (const process::action_name_multiset& l : allowlist)
41 {
42 const core::identifier_string_list& names = l.names();
43 result.insert(result.end(), names.begin(), names.end());
44 }
45 std::sort(result.begin(), result.end(), process::action_name_compare());
46 const auto it = std::unique(result.begin(), result.end());
47 result.erase(it, result.end());
48
49 return result;
50}
51
52/// a tuple_list contains pairs of actions (multi-action) and the condition under which this action
53/// can occur.
55{
58
59 std::size_t size() const
60 {
61 assert(actions.size() == conditions.size());
62 return actions.size();
63 }
64
65 tuple_list() = default;
66
67 tuple_list(const std::vector<process::action_list>& actions_, const std::vector<data::data_expression>& conditions_)
70 {}
71
72 tuple_list(std::vector<process::action_list>&& actions_, std::vector<data::data_expression>&& conditions_)
75 {}
76};
77
78/// Extends the list \f$S\f$ to \f$S \mathrel{++} [(a \oplus \alpha, c \land c') \mid (\alpha, c') \in T]\f$
79///
80/// Note that by using move semantics for L, we force the caller to transfer ownership of L to this function,
81/// and make it explicit that L should not be used by the caller afterwards.
82/// If firstaction == action(), it is not added to the multiactions in L', but the conditions will be strengthened.
83/// \pre condition != sort_bool::false_()
84// NOLINTNEXTLINE(cppcoreguidelines-rvalue-reference-param-not-moved) L is consumed: its actions are moved into S via move-iterators (see note above).
85inline void addActionCondition(const process::action& a, const data::data_expression& c, tuple_list&& L, tuple_list& S)
86{
87 assert(c != data::sort_bool::false_()); // It makes no sense to add an action with condition false, as it cannot
88 // happen anyhow.
89
90 if (a == process::action())
91 {
92 S.actions.insert(S.actions.end(),
93 std::make_move_iterator(L.actions.begin()),
94 std::make_move_iterator(L.actions.end()));
95 }
96 else
97 {
98 for (process::action_list& m : L.actions)
99 {
100 m = atermpp::insert_sorted(a, m);
101 S.actions.emplace_back(std::move(m));
102 }
103 }
104
106 {
107 S.conditions.insert(S.conditions.end(),
108 std::make_move_iterator(L.conditions.begin()),
109 std::make_move_iterator(L.conditions.end()));
110 }
111 else
112 {
113 // Strengthen the conditions in L with condition and append to S.
114 for (const data::data_expression& x : L.conditions)
115 {
116 S.conditions.emplace_back(data::lazy::and_(x, c));
117 }
118 }
119}
120
121/// Data structure to store the communication function more efficiently.
123{
124protected:
125 /// Left-hand sides of communication expressions
127
128 /// Right-hand sides of communication expressions
130
131 /// Temporary data using in determining whether communication is allowed.
132 /// See usages of the data structure below.
135
137 {
138 for (std::size_t i = 0; i < size(); ++i)
139 {
140 m_lhs_iters[i] = m_lhs[i].begin();
141 m_match_failed[i] = false;
142 }
143 }
144
145 /// Check if m is contained in a lhs in the communication entry. (in fact, it must be a prefix).
146 /// Returns true if this is the case, false otherwise.
147 /// Postcondition: for every i such that m is not contained in lhs[i], match_failed[i] is true.
148 /// NB: resets temporary data before performing computations.
149 bool match_multiaction(const process::action_list& multi_action)
150 {
151 assert(std::is_sorted(multi_action.begin(), multi_action.end()));
152
154
155 // m must match a lhs; check every action
156 for (const process::action& action : multi_action)
157 {
158 // check every lhs for actionname
159 bool comm_ok = false;
160 for (std::size_t i = 0; i < size(); ++i)
161 {
162 if (m_match_failed[i]) // lhs i does not match
163 {
164 continue;
165 }
166 if (m_lhs_iters[i] == m_lhs[i].end()) // lhs cannot match actionname
167 {
168 m_match_failed[i] = true;
169 continue;
170 }
171 if (action.label().name() != *m_lhs_iters[i])
172 {
173 // no match
174 m_match_failed[i] = true;
175 }
176 else
177 {
178 // possible match; on to next action
179 ++m_lhs_iters[i];
180 comm_ok = true;
181 }
182 }
183
184 if (!comm_ok) // no (possibly) matching lhs
185 {
186 return false;
187 }
188 }
189
190 // There must be an lhs that contains m.
191 return true;
192 }
193
194 // Initialization of lhs, defined as static function so it can be used in the constructor.
195 // Allows lhs to be defined as const.
198 {
199 std::vector<core::identifier_string_list> result;
200 for (const process::communication_expression& l : communications)
201 {
202 const core::identifier_string_list& names = l.action_name().names();
203 assert(std::is_sorted(names.begin(), names.end(), process::action_name_compare()));
204 result.emplace_back(names.begin(), names.end());
205 }
206 return result;
207 }
208
209 // Initialization of rhs, defined as static function so it can be used in the constructor.
210 // Allows rhs to be defined as const.
212 {
213 std::vector<core::identifier_string> result;
214 for (const process::communication_expression& l : communications)
215 {
216 result.push_back(l.name());
217 }
218 return result;
219 }
220
221public:
222 // comm_entries are not copyable.
223 comm_entry(const comm_entry&) = delete;
224 comm_entry& operator=(const comm_entry&) = delete;
225
226 explicit comm_entry(const process::communication_expression_list& communications)
231 {}
232
233 ~comm_entry() = default;
234
235 std::size_t size() const
236 {
237 assert(m_lhs.size() == m_rhs.size());
238 assert(m_rhs.size() == m_lhs_iters.size());
239 assert(m_lhs_iters.size() == m_match_failed.size());
240 return m_lhs.size();
241 }
242
243 /// Determine if there exists a communication expression a1|...|an -> b in comm_table
244 /// such that m' = a1|...|an , where m' is the multiset of actionnames for multiaction m.
245 /// That is, the actions in m consting of actions and data occur in C, such tat a communication
246 /// can take place.
247 ///
248 /// if \f$\exists_{(b,c) \in C} b = \mu(m)\f$, return \f$c\f$, otherwise return action_label()
250 {
251 assert(std::is_sorted(m.begin(), m.end()));
252
253 process::action_label result; // if no match found, return process::action_label()
254
256 {
257 // There is a lhs that has m as prefix. Find it, and determine if the lhs matches m completely.
258 for (std::size_t i = 0; i < size(); ++i)
259 {
260 // lhs i matches only if comm_table[i] is empty
261 if ((!m_match_failed[i]) && m_lhs_iters[i] == m_lhs[i].end())
262 {
263 if (m_rhs[i] == process::tau())
264 {
265 throw mcrl2::runtime_error("Cannot linearise a process with a communication operator, containing a "
266 "communication that results in tau or that has an empty right hand side");
267 }
268 result = process::action_label(m_rhs[i], m.begin()->label().sorts());
269 break;
270 }
271 }
272 }
273
274 return result;
275 }
276
277 /// Calculate \f$\exists_{o,c}\ (\mu(m) \oplus o,\ c) \in C\f$, with \f$o \subseteq n\f$
278 ///
279 /// The function calculates whether the actions in m (consisting of actions and data) occur in a left hand side
280 /// of a communication a1|...|ak -> b in C (that is, the names of m are a subbag of a1|...|ak), and the actions
281 /// a1|...|ak that are not in m are in n. I.e., there is a subbag o of n such that m+o can communicate.
282 bool might_communicate(const process::action_list& m, const process::action_list& n)
283 {
284 assert(std::is_sorted(m.begin(), m.end()));
285 assert(std::is_sorted(n.begin(), n.end()));
286
287 /* this function indicates whether the actions in m
288 consisting of actions and data occur in C, such that
289 a communication might take place (i.e. m is a subbag
290 of the lhs of a communication in C).
291 if n is not empty, then all actions of a matching communication
292 that are not in m should be in n (i.e. there must be a
293 subbag o of n such that m+o can communicate. */
294 bool result = false;
295
297 {
298 // the rest of actions of lhs that are not in m should be in n
299 // rest[i] contains the part of n in which lhs i has to find matching actions
300 // if rest[i] cannot match the next remaining action in the left hand side, stored in m_lhs_iters[i], i.e.,
301 // rest[i] becomes empty before matching all actions in the lhs, we set it to std::nullopt. N.B. when rest[i]
302 // becomes empty after matching all actions in the lhs, rest[i].empty() is a meaningful result: we have a
303 // successful match.
304 std::vector<std::optional<process::action_list::const_iterator>> rest(size(),
305 n.begin()); // pairs of iterator into n; the second element of the pair indicates the end of the range in n.
306
307 // check every lhs
308 for (std::size_t i = 0; i < size(); ++i)
309 {
310 if (m_match_failed[i]) // lhs i did not contain m
311 {
312 continue;
313 }
314
315 // as long as there are still unmatched actions in lhs i...
316 // NOLINTBEGIN(bugprone-unchecked-optional-access) rest[i] is only dereferenced while the loop invariant
317 // asserted below holds; every path that sets rest[i] to std::nullopt immediately breaks out before rest[i]
318 // is dereferenced again.
319 while (m_lhs_iters[i] != m_lhs[i].end())
320 {
321 assert(rest[i] != std::nullopt);
322 // .. find them in rest[i]
323 if (*rest[i] == n.end()) // no luck
324 {
325 rest[i] = std::nullopt;
326 break;
327 }
328 // get first action in lhs i
329 const core::identifier_string& comm_name = *m_lhs_iters[i];
330 core::identifier_string rest_name = (*rest[i])->label().name();
331 // find it in rest[i]
332 while (comm_name != rest_name)
333 {
334 ++(*rest[i]);
335 if (*rest[i] == n.end()) // no more
336 {
337 rest[i] = std::nullopt;
338 break;
339 }
340 rest_name = (*rest[i])->label().name();
341 }
342 if (comm_name != rest_name) // action was not found
343 {
344 break;
345 }
346
347 // action found; try next
348 ++(*rest[i]);
349 ++m_lhs_iters[i];
350 }
351 // NOLINTEND(bugprone-unchecked-optional-access)
352
353 if (rest[i] != std::nullopt) // lhs was found in rest[i]
354 {
355 result = true;
356 break;
357 }
358 }
359 }
360
361 return result;
362 }
363};
364
365template <typename DataRewriter>
367{
368public:
369 apply_communication_algorithm(const process::action& termination_action,
370 DataRewriter& data_rewriter,
371 const process::communication_expression_list& communications,
372 const process::action_name_multiset_list& allowlist,
373 bool is_allow,
374 bool is_block)
375 : m_terminationAction(termination_action),
376 m_data_rewriter(data_rewriter),
383 m_is_allow(is_allow),
384 m_is_block(is_block)
385 {}
386
388
389 /// Calculate the communication operator applied to a multiaction.
390 ///
391 /// As the actions in the multiaction can be parameterized with open data expressions, for every subset of
392 /// communication expressions that match the multiaction, the result contains a multiaction (in which the particular
393 /// subset of communication expressions has been applied), and a corresponding condition that requires that the
394 /// parameters are equal for the actions in the left-hand-sides of the matching communication expressions.
395 /// Multiactions whose condition is false may be removed.
396 ///
397 /// This is the function \f$\overline{\gamma}\f$ in M. v. Weerdenburg. Calculation of Communication with Open Terms in
398 /// GenSpect Process Algebra.
399 ///
400 /// \param m The multiaction to which the communication operator is applied
401 tuple_list apply(const process::action_list& m)
402 {
403 assert(std::is_sorted(m.begin(), m.end()));
404 const process::action_list r;
405 return makeMultiActionConditionList_aux(m, r);
406 }
407
408 /// Apply the communication composition to a list of action summands.
409 void apply(stochastic_action_summand_vector& action_summands,
410 deadlock_summand_vector& deadlock_summands,
411 bool nosumelm,
412 bool nodeltaelimination,
413 bool ignore_time)
414 {
415 assert(!(m_is_allow && m_is_block));
416
417 /* We follow the implementation of Muck van Weerdenburg, described in
418 a note: Calculation of communication with open terms. */
419
420 mCRL2log(mcrl2::log::log_level_t::verbose) << (m_is_allow
421 ? "- calculating the communication operator modulo the allow operator on "
422 : m_is_block
423 ? "- calculating the communication operator modulo the block operator on "
424 : "- calculating the communication operator on ")
425 << action_summands.size() << " action summands";
426
427 [[maybe_unused]]
428 lps_statistics_t lps_statistics_before = get_statistics(action_summands, deadlock_summands);
429 // number of summands filtered out after construction of intermediate result (all potential results of communication
430 // that may be allowed/are not blocked)
431 [[maybe_unused]]
432 std::size_t disallowed_summands = 0; // removed by allow
433 [[maybe_unused]]
434 std::size_t blocked_summands = 0; // removed by block
435 [[maybe_unused]]
436 std::size_t false_condition_summands = 0; // removed because condition is false
437
438 mCRL2log(mcrl2::log::log_level_t::trace) << "Calculating communication operator using a set of " << m_communications.size()
439 << " communication expressions." << std::endl;
440 mCRL2log(mcrl2::log::log_level_t::trace) << "Communication expressions: " << std::endl
441 << core::detail::print_set(m_communications) << std::endl;
442 mCRL2log(mcrl2::log::log_level_t::trace) << "Allow list: " << std::endl << core::detail::print_set(m_allowlist) << std::endl;
443
444 deadlock_summand_vector resulting_deadlock_summands;
445 deadlock_summands.swap(resulting_deadlock_summands);
446
447 const bool inline_allow = m_is_allow || m_is_block;
448 if (inline_allow)
449 {
450 // Inline allow is only supported for ignore_time,
451 // for in other cases generation of delta summands cannot be inlined in any simple way.
452 assert(!nodeltaelimination && ignore_time);
453 deadlock_summands.emplace_back(data::variable_list(), data::sort_bool::true_(), deadlock());
454 }
455
456 stochastic_action_summand_vector resulting_action_summands;
457
458 for (const stochastic_action_summand& smmnd : action_summands)
459 {
460 const data::variable_list& sumvars = smmnd.summation_variables();
461 const process::action_list& multiaction = smmnd.multi_action().actions();
462 const data::data_expression& time = smmnd.multi_action().time();
463 const data::data_expression& condition = smmnd.condition();
464 const data::assignment_list& nextstate = smmnd.assignments();
465 const stochastic_distribution& dist = smmnd.distribution();
466
467 if (!inline_allow)
468 {
469 /* Recall a delta summand for every non delta summand.
470 * The reason for this is that with communication, the
471 * conditions for summands can become much more complex.
472 * Many of the actions in these summands are replaced by
473 * delta's later on. Due to the more complex conditions it
474 * will be hard to remove them. By adding a default delta
475 * with a simple condition, makes this job much easier
476 * later on, and will in general reduce the number of delta
477 * summands in the whole system */
478
479 // Create new list of summand variables containing only those that occur in the condition or the timestamp.
480 data::variable_list newsumvars;
481 atermpp::make_term_list(
482 newsumvars,
483 sumvars.begin(),
484 sumvars.end(),
485 [](const data::variable& v) { return v; },
486 [&condition, &time](const data::variable& v)
487 { return occursinterm(condition, v) || occursinterm(time, v); });
488
489 resulting_deadlock_summands.emplace_back(newsumvars, condition, deadlock(time));
490 }
491
492 /* the multiactionconditionlist is a list containing
493 tuples, with a multiaction and the condition,
494 expressing whether the multiaction can happen. All
495 conditions exclude each other. Furthermore, the list
496 is not empty. If no communications can take place,
497 the original multiaction is delivered, with condition
498 true. */
499
500 // We calculate the communication operator on the multiaction in this single summand. As the actions in the
501 // multiaction can be parameterized with open data expressions, for every subset of applicable communication
502 // expressions this list in principle contains one summand (unless the condition can be rewritten to false, in
503 // which case it is omitted).
504
505 mCRL2log(mcrl2::log::log_level_t::trace) << "Calculating communication on multiaction with " << multiaction.size()
506 << " actions." << std::endl;
507 mCRL2log(mcrl2::log::log_level_t::trace) << " Multiaction: " << process::pp(multiaction) << std::endl;
508
509 const tuple_list multiactionconditionlist = apply(multiaction);
510
511 mCRL2log(mcrl2::log::log_level_t::trace) << "Calculating communication on multiaction with " << multiaction.size()
512 << " actions results in " << multiactionconditionlist.size() << " potential summands"
513 << std::endl;
514
515 for (std::size_t i = 0; i < multiactionconditionlist.size(); ++i)
516 {
517 const process::action_list& multiaction = multiactionconditionlist.actions[i];
518
519 if (m_is_allow && !allow_(m_allow_cache, multiaction, m_terminationAction))
520 {
521 if constexpr (EnableLineariseStatistics) {
522 ++disallowed_summands;
523 }
524
525 continue;
526 }
527 if (m_is_block && encap(m_allowlist, multiaction))
528 {
529 if constexpr (EnableLineariseStatistics) {
530 ++blocked_summands;
531 }
532 continue;
533 }
534
535 const data::data_expression communicationcondition = m_data_rewriter(multiactionconditionlist.conditions[i]);
536
537 const data::data_expression newcondition = m_data_rewriter(data::lazy::and_(condition, communicationcondition));
538 stochastic_action_summand new_summand(sumvars,
539 newcondition,
540 smmnd.multi_action().has_time() ? multi_action(multiaction, smmnd.multi_action().time())
541 : multi_action(multiaction),
542 nextstate,
543 dist);
544 if (!nosumelm)
545 {
546 if (sumelm(new_summand))
547 {
548 new_summand.condition() = m_data_rewriter(new_summand.condition());
549 }
550 }
551 if constexpr (EnableLineariseStatistics)
552 {
553 if (new_summand.condition() == data::sort_bool::false_())
554 {
555 ++false_condition_summands;
556 }
557 }
558
559 if (new_summand.condition() != data::sort_bool::false_())
560 {
561 resulting_action_summands.push_back(new_summand);
562 }
563 }
564 }
565
566 action_summands.swap(resulting_action_summands);
567
568 /* Now the resulting delta summands must be added again */
569 if (!inline_allow && !nodeltaelimination)
570 {
571 for (const deadlock_summand& summand : resulting_deadlock_summands)
572 {
573 insert_timed_delta_summand(action_summands, deadlock_summands, summand, ignore_time);
574 }
575 }
576
577 if constexpr (EnableLineariseStatistics)
578 {
579 lps_statistics_t lps_statistics_after = get_statistics(action_summands, deadlock_summands);
580 std::cout << log_comm_application(lps_statistics_before,
581 lps_statistics_after,
582 disallowed_summands,
583 blocked_summands,
584 false_condition_summands);
585 }
586
587 mCRL2log(mcrl2::log::log_level_t::verbose) << " resulting in " << action_summands.size() << " action summands and "
588 << deadlock_summands.size() << " delta summands\n";
589 }
590
591protected:
592
594 DataRewriter& m_data_rewriter;
595 const process::communication_expression_list m_communications;
596 const process::action_name_multiset_list m_allowlist; // This is a list of list of identifierstring.
597 const detail::allow_list_cache m_allow_cache; // This is a cache for allowlist, used to speed up lookups in allowlist. It contains the same information as allowlist, but in a different format that allows for faster lookups.
598 const std::vector<core::identifier_string> m_blocked_actions; // used only if m_is_block is set
599 const std::vector<core::identifier_string> m_allowed_actions; // used only if m_is_allow is set
601 const bool
602 m_is_allow; // If is_allow or is_block is set, perform inline allow/block filtering. They are mutually exclusive
603 const bool m_is_block;
604
610 size_t indent = 0) const
611 {
612 std::string indent_str(indent, ' ');
613 std::ostringstream os;
614
615 os << indent_str << "- operator: comm" << std::endl;
616
617 indent += 2;
618 indent_str = std::string(indent, ' ');
619 os << indent_str << "number of communication expressions: " << m_communications.size() << std::endl;
620 if (m_is_allow)
621 {
622 os << indent_str << "number of allow expressions: " << m_allowlist.size() << std::endl;
623 }
624 if (m_is_block)
625 {
626 os << indent_str << "number of block expressions: " << m_blocked_actions.size() << std::endl;
627 }
628
629 os << indent_str << "before:" << std::endl
630 << print(lps_statistics_before, indent + 2) << indent_str << "after:" << std::endl
631 << print(lps_statistics_after, indent + 2) << indent_str << "removed from intermediate result:" << std::endl;
632
633 indent += 2;
634 indent_str = std::string(indent, ' ');
635 if (m_is_allow)
636 {
637 os << indent_str << "disallowed summands: " << disallowed_summands << std::endl;
638 }
639 if (m_is_block)
640 {
641 os << indent_str << "blocked summands: " << blocked_summands << std::endl;
642 }
643
644 os << indent_str << "summands with false condition: " << false_condition_summands << std::endl;
645
646 return os.str();
647 }
648
649 /// Static initialization function to ensure m_allowed_actions can be const.
653 {
654 std::vector<core::identifier_string> result;
655 if (is_allow)
656 {
657 result = get_actions(allow_list);
658 // Ensure that the termination action is always allowed, even when it is not an explicit part of
659 // the list of allowed actions.
660 // We maintains sort order of the vector
661 std::vector<core::identifier_string>::iterator it
662 = std::upper_bound(result.begin(), result.end(), termination_action.label().name(), process::action_name_compare());
663 result.insert(it, termination_action.label().name());
664 }
665
666 return result;
667 }
668
669 /// Calculate data expression for pairwise equality of the elements of l1 and l2.
670 ///
671 /// If the lengths of l1 and l2 differ, or for some index i, the sort l1[i] and l2[i] is different, the pairwise
672 /// match is false, otherwise an expression equivalent to \f$\bigwedge_i (l1[i] == l2[i])\f$ is returned.
673 data::data_expression pairwise_equal_to(const data::data_expression_list& l1,
674 const data::data_expression_list& l2) const
675 {
677
678 if (l1.size() != l2.size())
679 {
681 }
682
683 auto i1 = l1.begin();
684 auto i2 = l2.begin();
685
686 while (i1 != l1.end() && i2 != l2.end() && result != data::sort_bool::false_())
687 {
688 if (i1->sort() != i2->sort())
689 {
690 result = data::sort_bool::false_();
691 }
692 else
693 {
694 result = data::lazy::and_(result, m_data_rewriter(equal_to(*i1++, *i2++)));
695 }
696 }
697
698 return result;
699 }
700
701 /// Determine if the action is allowable, that is, it is part of an allow expression
702 /// and it is not part of a block expression
703 bool maybe_allowed(const process::action_label& a) const
704 {
705 assert(std::is_sorted(m_allowed_actions.begin(), m_allowed_actions.end(), process::action_name_compare()));
706 assert(std::is_sorted(m_blocked_actions.begin(), m_blocked_actions.end(), process::action_name_compare()));
707 assert(!m_is_block || m_allowed_actions.empty());
708 assert(!m_is_allow || m_blocked_actions.empty());
709
710 return !(m_is_allow || m_is_block)
711 || (m_is_allow
712 && std::binary_search(m_allowed_actions.begin(),
713 m_allowed_actions.end(),
714 a.name(),
715 process::action_name_compare()))
716 || (m_is_block
717 && !std::binary_search(m_blocked_actions.begin(),
718 m_blocked_actions.end(),
719 a.name(),
720 process::action_name_compare()));
721 }
722
723 /// Calculate the communication operator applied to a multiaction.
724 ///
725 /// This is the function \f$\overline{\gamma}(C, r)\f$ as described in M. v. Weerdenburg. Calculation of Communication
726 /// with Open Terms in GenSpect Process Algebra.
727 ///
728 /// \param m The multiaction to which the communication operator should be applied
729 /// \param r The communication expressions that must be applied to the multiaction
730 inline tuple_list makeMultiActionConditionList_aux(const process::action_list& m, const process::action_list& r)
731 {
732 assert(std::is_sorted(m.begin(), m.end()));
733 assert(std::is_sorted(r.begin(), r.end()));
734
735 tuple_list S; // result
736
737 // if m = [], then S := { (r, \psi(r, C)) }
738 if (m.empty())
739 {
740 if (r.empty())
741 {
742 S.conditions.emplace_back(data::sort_bool::true_());
743 }
744 else
745 {
746 S.conditions.emplace_back(psi(r));
747 }
748
749 // TODO: Why don't we insert r here, as van Weerdenburg writes?
750 S.actions.emplace_back();
751 }
752 else
753 {
754 // m = [a(d)] \oplus n
755 const process::action& a = m.front();
756 const process::action_list& m_tail = m.tail();
757
758 // S = \phi(a(d), d, [], n, C, r)
759 S = phi({a}, a.arguments(), process::action_list(), m_tail, r);
760
761 // addActionCondition adds a to every multiaction in T; so if a is not part of any allowed action,
762 // we can skip this part.
764 {
765 // T = \overline{\gamma}(n, C, [a(d)] \oplus r)
766 tuple_list T = makeMultiActionConditionList_aux(m_tail, atermpp::insert_sorted(a, r));
767
768 // S := S \cup \{ (a,true) \oplus t \mid t \in T \}
769 // TODO: van Weerdenburg in his note only calculates S := S \cup T. Understand why that is not correct.
770 addActionCondition(a, data::sort_bool::true_(), std::move(T), S);
771 }
772 }
773 return S;
774 }
775
776 /// Calculate \f$\phi(m, d, w, n, C, r)\f$ as described in M. v. Weerdenburg. Calculation of Communication
777 /// with Open Terms in GenSpect Process Algebra.
778 ///
779 /// phi is a function that yields a list of pairs indicating how the actions in m|w|n can communicate.
780 /// The pairs contain the resulting multi action and a condition on data indicating when communication can take place.
781 /// In the communication all actions of m, none of w and a subset of n can take part in the communication.
782 /// d is the data parameter of the communication and comm_table contains a list of multiaction action pairs
783 /// indicating possible communications.
784 inline tuple_list phi(const process::action_list& m,
785 const data::data_expression_list& d,
786 const process::action_list& w,
787 const process::action_list& n,
788 const process::action_list& r)
789 {
790 assert(std::is_sorted(m.begin(), m.end()));
791 assert(std::is_sorted(w.begin(), w.end()));
792 assert(std::is_sorted(n.begin(), n.end()));
793 assert(std::is_sorted(r.begin(), r.end()));
794
795 tuple_list S;
796
797 // \exists_{o,c} (\mu(m) \oplus o, c) \in C, with o \subseteq n
798 if (m_comm_table.might_communicate(m, n))
799 {
800 if (n.empty()) // b \land n = []
801 {
802 // There is communication expression whose lhs matches m, result is c.
803 const process::action_label c = m_comm_table.can_communicate(m); /* returns process::action_label() if no
804 communication is possible */
805
807 {
808 // \exists_{(b,c) \in C} b = \mu(m)
809 // the result of the communication is part of an allow, not in the block set.
810 // Calculate communication for multiaction w.
811 // T := \overline{\gamma}(w, C)
813
814 // S := \{ (c(d) \oplus r, e) \mid (r,e) \in T \}
815 addActionCondition(process::action(c, d), data::sort_bool::true_(), std::move(T), S);
816 }
817 }
818 else
819 {
820 // n = [a(f)] \oplus o
821 const process::action& a = n.front();
822 const process::action_list& n_tail = n.tail();
823
825 if (condition == data::sort_bool::false_())
826 {
827 // a(f) cannot take part in communication as the arguments do not match. Move to w and continue with next
828 // action
829 S = phi(m, d, atermpp::insert_sorted(a, w), n_tail, r);
830 }
831 else
832 {
833 tuple_list T = phi(atermpp::insert_sorted(a, m), d, w, n_tail, r);
834
835 S = phi(m, d, atermpp::insert_sorted(a, w), n_tail, r);
836 addActionCondition(process::action(), condition, std::move(T), S);
837 }
838 }
839 }
840
841 return S;
842 }
843
844 bool xi(const process::action_list& alpha, const process::action_list& beta)
845 {
846 bool result = false;
847
848 if (beta.empty())
849 {
850 result = m_comm_table.can_communicate(alpha) != process::action_label();
851 }
852 else
853 {
854 const process::action_list alpha_ = atermpp::insert_sorted(beta.front(), alpha);
855
856 if (m_comm_table.can_communicate(alpha_) != process::action_label())
857 {
858 result = true;
859 }
860 else
861 {
862 const process::action_list& beta_tail = beta.tail();
863 if (m_comm_table.might_communicate(alpha_, beta_tail))
864 {
865 result = xi(alpha, beta_tail);
866 }
867
868 result = result || xi(alpha, beta_tail);
869 }
870 }
871 return result;
872 }
873
874 data::data_expression psi(process::action_list alpha)
875 {
876 assert(std::is_sorted(alpha.begin(), alpha.end()));
878
879 process::action_list actl; // used in inner loop.
880 while (!alpha.empty())
881 {
882 process::action_list beta = alpha.tail();
883
884 while (!beta.empty())
885 {
886 actl = process::action_list();
887 actl = atermpp::insert_sorted(alpha.front(), actl);
888 actl = atermpp::insert_sorted(beta.front(), actl);
889 const process::action_list& beta_tail = beta.tail();
890 if (m_comm_table.might_communicate(actl, beta_tail) && xi(actl, beta_tail))
891 {
892 // sort and remove duplicates??
893 cond = data::lazy::or_(cond, pairwise_equal_to(alpha.front().arguments(), beta.front().arguments()));
894 }
895 beta = beta_tail;
896 }
897
898 alpha = alpha.tail();
899 }
900 cond = data::lazy::not_(cond);
901 return cond;
902 }
903};
904} // namespace detail
905
906inline void communicationcomposition(const process::communication_expression_list& communications,
907 const process::action_name_multiset_list& allowlist, // This is a list of list of identifierstring.
908 const bool is_allow, // If is_allow or is_block is set, perform inline allow/block filtering.
909 const bool is_block,
910 stochastic_action_summand_vector& action_summands,
911 deadlock_summand_vector& deadlock_summands,
912 const process::action& terminationAction,
913 const bool nosumelm,
914 const bool nodeltaelimination,
915 const bool ignore_time,
916 const std::function<data::data_expression(const data::data_expression&)>& RewriteTerm)
917
918{
919 detail::apply_communication_algorithm(terminationAction,
920 RewriteTerm,
921 communications,
922 allowlist,
923 is_allow,
924 is_block)
925 .apply(action_summands, deadlock_summands, nosumelm, nodeltaelimination, ignore_time);
926}
927
928} // namespace mcrl2::lps
929
930
931
932#endif // MCRL2_LPS_LINEARISE_COMMUNICATION_H
aterm_string & operator=(const aterm_string &t) noexcept=default
aterm(const aterm &other) noexcept=default
This class has user-declared copy constructor so declare default copy and move operators.
A list of aterm objects.
Definition aterm_list.h:26
A unordered_map class in which aterms can be stored.
An abstraction expression.
Definition abstraction.h:23
const variable_list & variables() const
Definition abstraction.h:60
const data_expression & body() const
Definition abstraction.h:65
const binder_type & binding_operator() const
Definition abstraction.h:55
\brief A sort alias
Definition alias.h:23
alias(const basic_sort &name, const sort_expression &reference)
\brief Constructor Z12.
Definition alias.h:39
\brief Assignment expression
Definition assignment.h:24
\brief Assignment of a data expression to a variable
Definition assignment.h:88
const data_expression & rhs() const
Definition assignment.h:119
const variable & lhs() const
Definition assignment.h:114
\brief A basic sort
Definition basic_sort.h:25
data_expression & operator=(const data_expression &) noexcept=default
data_expression()
\brief Default constructor X3.
data_expression & operator=(data_expression &&) noexcept=default
sort_expression sort() const
Returns the sort of the data expression.
Definition data.cpp:107
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
Default constructor. Generate a data specification that contains only booleans and positive numbers.
data_type_checker(const data_specification &data_spec)
make a data type checker. Throws a mcrl2::runtime_error exception if the data_specification is not we...
void add_consistent_inequality_set(const std::vector< linear_inequality > &inequalities_in_)
inequality_consistency_cache & operator=(const inequality_consistency_cache &)=delete
inequality_consistency_cache(const inequality_consistency_cache &)=delete
bool is_consistent(const std::vector< linear_inequality > &inequalities_in_) const
std::unique_ptr< inequality_inconsistency_cache_base > m_cache
inequality_inconsistency_cache_base & operator=(const inequality_inconsistency_cache_base &)=delete
std::unique_ptr< inequality_inconsistency_cache_base > m_present_branch
std::unique_ptr< inequality_inconsistency_cache_base > m_non_present_branch
inequality_inconsistency_cache_base(const node_type node, const linear_inequality &inequality, std::unique_ptr< inequality_inconsistency_cache_base > present_branch, std::unique_ptr< inequality_inconsistency_cache_base > non_present_branch)
inequality_inconsistency_cache_base(const inequality_inconsistency_cache_base &)=delete
bool is_inconsistent(const std::vector< linear_inequality > &inequalities_in_) const
inequality_inconsistency_cache & operator=(const inequality_consistency_cache &)=delete
inequality_inconsistency_cache(const inequality_inconsistency_cache &)=delete
void add_inconsistent_inequality_set(const std::vector< linear_inequality > &inequalities_in_)
std::unique_ptr< inequality_inconsistency_cache_base > m_cache
lhs_t(const aterm &t)
Constructor from an aterm.
const data_expression & operator[](const variable &v) const
Give the factor of variable v.
data_expression transform_to_data_expression() const
lhs_t erase(const variable &v) const
Erase a variable and its factor.
std::size_t count(const variable &v) const
Give the factor of variable v.
lhs_t(const ITERATOR begin, const ITERATOR end, TRANSFORMER f)
Constructor.
data_expression evaluate(const SubstitutionFunction &beta, const rewriter &r) const
Evaluate the variables in this lhs_t according to the subsitution function.
lhs_t::const_iterator find(const variable &v) const
Give an iterator of the factor/variable pair for v, or end() if v does not occur.
lhs_t(const ITERATOR begin, const ITERATOR end)
Constructor.
variable_with_a_rational_factor(const variable &v, const data_expression &f)
\brief A function sort
\brief A function symbol
function_symbol & operator=(function_symbol &&) noexcept=default
function_symbol()
Default constructor.
const detail::lhs_t & lhs() const
linear_inequality invert(const rewriter &r)
bool typical_pair(data_expression &lhs_expression, data_expression &rhs_expression, detail::comparison_t &comparison_operator, const rewriter &r) const
Return this inequality as a typical pair of terms of the form <x1+c2 x2+...+cn xn,...
linear_inequality()
Constructor yielding an inconsistent inequality.
bool is_true(const rewriter &r) const
void add_variables(std::set< variable > &variable_set) const
bool is_false(const rewriter &r) const
linear_inequality(const data_expression &e, const rewriter &r)
Constructor that constructs a linear inequality out of a data expression.
linear_inequality(const data_expression &lhs, const data_expression &rhs, const detail::comparison_t comparison, const rewriter &r, const bool negate=false)
constructor.
data_expression transform_to_data_expression() const
static void parse_and_store_expression(const data_expression &e, detail::map_based_lhs_t &new_lhs, data_expression &new_rhs, const rewriter &r, const bool negate=false, const data_expression &factor=real_one())
linear_inequality(const detail::lhs_t &lhs, const data_expression &r, detail::comparison_t t)
Basic constructor.
detail::lhs_t::const_iterator lhs_begin() const
detail::lhs_t::const_iterator lhs_end() const
linear_inequality(const detail::lhs_t &lhs, const data_expression &rhs, detail::comparison_t comparison, const rewriter &r)
constructor.
const data_expression & rhs() const
data_expression get_factor_for_a_variable(const variable &x)
detail::comparison_t comparison() const
Wrapper clas s for internal storage and substitution updates using operator()
assignment(const variable_type &v, Substitution &sigma, std::multiset< variable_type > &variables_in_rhs, std::set< variable_type > &scratch_set)
Constructor.
assignment & operator=(const expression_type &e)
Actual assignment.
Wrapper that extends any substitution to a substitution maintaining the vars in its rhs.
bool variable_occurs_in_a_rhs(const variable_type &v)
Indicates whether a variable occurs in some rhs of this substitution.
assignment operator[](variable_type const &v)
Assigment operator.
const std::multiset< variable > & variables_in_rhs()
Provides a set of variables that occur in the right hand sides of the assignments.
maintain_variables_in_rhs()=default
Default constructor.
std::multiset< variable_type > m_variables_in_rhs
Components for generating an arbitrary element of a sort.
data_expression operator()(const sort_expression &sort)
Returns a representative of a sort.
Rewriter that operates on data expressions.
Definition rewriter.h:84
data_expression operator()(const data_expression &d) const
Rewrites a data expression.
Definition rewriter.h:161
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
\brief A sort expression
sort_expression & operator=(const sort_expression &) noexcept=default
\brief A constructor for a structured sort
function_symbol constructor_function(const sort_expression &s) const
Returns the constructor function for this constructor, assuming it is internally represented with sor...
function_symbol recogniser_function(const sort_expression &s) const
Returns the function corresponding to the recogniser of this constructor, such that it is usable in t...
const core::identifier_string & name() const
const data_expression_list & arguments() const
\brief Assignment of a data expression to a string
Definition assignment.h:179
\brief A data variable
Definition variable.h:25
const core::identifier_string & name() const
Definition variable.h:35
variable & operator=(variable &&) noexcept=default
const sort_expression & sort() const
Definition variable.h:40
\brief A where expression
where_clause(const atermpp::aterm &term)
const data_expression & body() const
const assignment_expression_list & declarations() const
LPS summand containing a multi-action.
lps::multi_action m_multi_action
The summation variables of the summand.
action_summand(const action_summand &) noexcept=default
Move semantics.
data::assignment_list & assignments()
Returns the sequence of assignments.
void swap(action_summand &other) noexcept
Swaps the contents.
action_summand()=default
Constructor.
data::data_expression_list next_state(const data::variable_list &process_parameters) const
Returns the next state corresponding to this summand.
Definition lps.cpp:71
action_summand(const data::variable_list &summation_variables, const data::data_expression &condition, const lps::multi_action &action, const data::assignment_list &assignments)
Constructor.
bool has_time() const
Returns true if time is available.
bool is_tau() const
Returns true if the multi-action corresponding to this summand is equal to tau.
action_summand & operator=(const action_summand &) noexcept=default
action_summand & operator=(action_summand &&) noexcept=default
action_summand(action_summand &&) noexcept=default
const data::assignment_list & assignments() const
Returns the sequence of assignments.
data::assignment_list m_assignments
The assignments of the next state.
Algorithm class for elimination of constant parameters.
Definition constelm.h:23
void LOG_PARAMETER_CHANGE(const data::data_expression &d_j, const data::data_expression &Rd_j, const data::data_expression &Rg_ij, const data::mutable_map_substitution<> &sigma, const std::string &msg="")
Definition constelm.h:61
bool is_constant(const data::data_expression &x, const std::set< data::variable > &global_variables) const
Definition constelm.h:96
void remove_parameters(data::mutable_map_substitution<> &sigma)
Applies the substitution computed by compute_constant_parameters.
Definition constelm.h:232
const DataRewriter & R
The rewriter used by the constelm algorithm.
Definition constelm.h:38
void LOG_CONSTANT_PARAMETERS(const data::mutable_map_substitution<> &sigma, const std::string &constant_removed_msg="", const std::string &nothing_removed_msg="")
Definition constelm.h:40
bool m_ignore_conditions
If true, conditions are not evaluated and assumed to be true.
Definition constelm.h:32
constelm_algorithm(Specification &spec, const DataRewriter &R_)
Constructor.
Definition constelm.h:113
void LOG_CONDITION(const data::data_expression &cond, const data::data_expression &c_i, const data::mutable_map_substitution<> &sigma, const std::string &msg="")
Definition constelm.h:78
void run(bool instantiate_global_variables=false, bool ignore_conditions=false)
Runs the constelm algorithm.
Definition constelm.h:257
std::map< data::variable, std::size_t > m_index_of
Maps process parameters to their index.
Definition constelm.h:35
data::mutable_map_substitution compute_constant_parameters(bool instantiate_global_variables=false, bool ignore_conditions=false)
Computes constant parameters.
Definition constelm.h:123
bool m_instantiate_global_variables
If true, then the algorithm is allowed to instantiate free variables as a side effect.
Definition constelm.h:29
LPS summand containing a deadlock.
deadlock_summand()=default
Constructor.
deadlock_summand & operator=(const deadlock_summand &) noexcept=default
lps::deadlock m_deadlock
The deadlock of the summand.
deadlock_summand(deadlock_summand &&) noexcept=default
deadlock_summand & operator=(deadlock_summand &&) noexcept=default
void swap(deadlock_summand &other) noexcept
Swaps the contents.
deadlock_summand(const deadlock_summand &) noexcept=default
Move semantics.
deadlock_summand(const data::variable_list &summation_variables, const data::data_expression &condition, const lps::deadlock &delta)
Constructor.
bool has_time() const
Returns true if time is available.
Represents a deadlock.
Definition deadlock.h:23
bool operator!=(const deadlock &other) const
Comparison operator.
Definition deadlock.h:71
data::data_expression m_time
The time of the deadlock. If m_time == data::undefined_real() the multi action has no time.
Definition deadlock.h:29
deadlock(data::data_expression time=data::undefined_real())
Constructor.
Definition deadlock.h:33
bool has_time() const
Returns true if time is available.
Definition deadlock.h:39
std::string to_string() const
Returns a string representation of the deadlock.
Definition deadlock.h:59
const data::data_expression & time() const
Returns the time.
Definition deadlock.h:46
void swap(deadlock &other) noexcept
Swaps the contents.
Definition deadlock.h:77
data::data_expression & time()
Returns the time.
Definition deadlock.h:53
bool operator==(const deadlock &other) const
Comparison operator.
Definition deadlock.h:65
void apply(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, bool nosumelm, bool nodeltaelimination, bool ignore_time)
Apply the communication composition to a list of action summands.
tuple_list makeMultiActionConditionList_aux(const process::action_list &m, const process::action_list &r)
const process::action_name_multiset_list m_allowlist
const process::communication_expression_list m_communications
tuple_list apply(const process::action_list &m)
const std::vector< core::identifier_string > m_blocked_actions
static std::vector< core::identifier_string > init_allowed_actions(bool is_allow, const process::action_name_multiset_list &allow_list, const process::action &termination_action)
Static initialization function to ensure m_allowed_actions can be const.
data::data_expression psi(process::action_list alpha)
apply_communication_algorithm(const process::action &termination_action, DataRewriter &data_rewriter, const process::communication_expression_list &communications, const process::action_name_multiset_list &allowlist, bool is_allow, bool is_block)
bool maybe_allowed(const process::action_label &a) const
const std::vector< core::identifier_string > m_allowed_actions
bool xi(const process::action_list &alpha, const process::action_list &beta)
data::data_expression pairwise_equal_to(const data::data_expression_list &l1, const data::data_expression_list &l2) const
tuple_list phi(const process::action_list &m, const data::data_expression_list &d, const process::action_list &w, const process::action_list &n, const process::action_list &r)
std::string log_comm_application(const lps_statistics_t &lps_statistics_before, const lps_statistics_t &lps_statistics_after, const std::size_t disallowed_summands, const std::size_t blocked_summands, const std::size_t false_condition_summands, size_t indent=0) const
Data structure to store the communication function more efficiently.
const std::vector< core::identifier_string_list > m_lhs
Left-hand sides of communication expressions.
~comm_entry()=default
static std::vector< core::identifier_string_list > init_lhs(const process::communication_expression_list &communications)
static std::vector< core::identifier_string > init_rhs(const process::communication_expression_list &communications)
const std::vector< core::identifier_string > m_rhs
Right-hand sides of communication expressions.
bool match_multiaction(const process::action_list &multi_action)
process::action_label can_communicate(const process::action_list &m)
comm_entry(const process::communication_expression_list &communications)
std::vector< bool > m_match_failed
void reset_temporary_data()
std::vector< core::identifier_string_list::const_iterator > m_lhs_iters
comm_entry & operator=(const comm_entry &)=delete
comm_entry(const comm_entry &)=delete
std::size_t size() const
bool might_communicate(const process::action_list &m, const process::action_list &n)
Algorithm class for algorithms on linear process specifications. It can be instantiated with lps::spe...
void remove_parameters(const std::set< data::variable > &to_be_removed)
Removes formal parameters from the specification.
void remove_unused_summand_variables()
Removes unused summand variables.
void sumelm_find_variables(const action_summand &s, std::set< data::variable > &result) const
void summand_remove_unused_summand_variables(SummandType &summand_)
void sumelm_find_variables(const deadlock_summand &s, std::set< data::variable > &result) const
data::data_expression next_state(const action_summand &s, const data::variable &v) const
Applies the next state substitution to the variable v.
bool verbose() const
Flag for verbose output.
void remove_singleton_sorts()
Removes parameters with a singleton sort.
void remove_trivial_summands()
Removes summands with condition equal to false.
void instantiate_free_variables()
Attempts to eliminate the free variables of the specification, by substituting a constant value for t...
lps_algorithm(Specification &spec)
Constructor.
Specification & m_spec
The specification that is processed by the algorithm.
data_expression & constraint()
Obtain a reference to the constraint.
deadlock_summand_vector & deadlock_summands()
Returns the sequence of deadlock summands.
const std::vector< ActionSummand > & action_summands() const
Returns the sequence of action summands.
deadlock_summand_vector m_deadlock_summands
The deadlock summands of the process.
linear_process_base()=default
Constructor.
data::variable_list m_process_parameters
The process parameters of the process.
linear_process_base(const data::variable_list &process_parameters, const deadlock_summand_vector &deadlock_summands, const std::vector< ActionSummand > &action_summands)
Constructor.
bool has_time() const
Returns true if time is available in at least one of the summands.
data::variable_list & process_parameters()
Returns the sequence of process parameters.
std::vector< ActionSummand > m_action_summands
The action summands of the process.
linear_process_base(const atermpp::aterm &lps, bool stochastic_distributions_allowed=true)
Constructor.
const deadlock_summand_vector & deadlock_summands() const
Returns the sequence of deadlock summands.
std::vector< ActionSummand > & action_summands()
Returns the sequence of action summands.
std::size_t summand_count() const
Returns the number of LPS summands.
const data::variable_list & process_parameters() const
Returns the sequence of process parameters.
linear_process(const data::variable_list &process_parameters, const deadlock_summand_vector &deadlock_summands, const action_summand_vector &action_summands)
Constructor.
linear_process(const atermpp::aterm &lps, bool=false)
Constructor.
linear_process()=default
Constructor.
\brief A timed multi-action
multi_action(const multi_action &) noexcept=default
Move semantics.
multi_action(const atermpp::aterm &term)
Constructor.
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 & operator=(const multi_action &) noexcept=default
multi_action(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(process_initializer &&) noexcept=default
process_initializer(const process_initializer &) noexcept=default
Move semantics.
process_initializer(const data::data_expression_list &expressions)
Constructor.
process_initializer(const atermpp::aterm &term, bool check_distribution=true)
Constructor.
data::data_expression_list expressions() const
process_initializer & operator=(const process_initializer &) noexcept=default
process_initializer()
Default constructor.
const std::set< data::variable > & global_variables() const
Returns the declared free variables of the LPS.
LinearProcess & process()
Returns a reference to the linear process of the specification.
process::action_label_list m_action_labels
The action specification of the specification.
specification_base(const data::data_specification &data, const process::action_label_list &action_labels, const std::set< data::variable > &global_variables, const LinearProcess &lps, const InitialProcessExpression &initial_process)
Constructor.
const process::action_label_list & action_labels() const
Returns a sequence of action labels. This sequence contains all action labels occurring in the specif...
const InitialProcessExpression & initial_process() const
Returns the initial process.
const LinearProcess & process() const
Returns the linear process of the specification.
process::action_label_list & action_labels()
Returns a sequence of action labels. This sequence contains all action labels occurring in the specif...
std::set< data::variable > m_global_variables
The set of global variables.
InitialProcessExpression & initial_process()
Returns a reference to the initial process.
specification_base()=default
Constructor.
LinearProcess m_process
The linear process of the specification.
std::set< data::variable > & global_variables()
Returns the declared free variables of the LPS.
data::data_specification m_data
The data specification of the specification.
InitialProcessExpression m_initial_process
The initial state of the specification.
Linear process specification.
specification()=default
Constructor.
specification(const data::data_specification &data, const process::action_label_list &action_labels, const std::set< data::variable > &global_variables, const linear_process &lps, const process_initializer &initial_process)
Constructor.
LPS summand containing a multi-action.
stochastic_distribution m_distribution
The distribution of the summand.
stochastic_action_summand & operator=(const stochastic_action_summand &) noexcept=default
stochastic_action_summand()=default
Constructor.
stochastic_action_summand(stochastic_action_summand &&) noexcept=default
const stochastic_distribution & distribution() const
Returns the distribution of this summand.
stochastic_action_summand(const action_summand &s)
Constructor.
stochastic_action_summand & operator=(stochastic_action_summand &&) noexcept=default
void swap(stochastic_action_summand &other) noexcept
Swaps the contents.
stochastic_action_summand(const data::variable_list &summation_variables, const data::data_expression &condition, const lps::multi_action &action, const data::assignment_list &assignments, const stochastic_distribution &distribution)
Constructor.
stochastic_action_summand(const stochastic_action_summand &) noexcept=default
Move semantics.
stochastic_distribution & distribution()
Returns the distribution of this summand.
\brief A stochastic distribution
stochastic_distribution & operator=(stochastic_distribution &&) noexcept=default
stochastic_distribution(stochastic_distribution &&) noexcept=default
stochastic_distribution()
\brief Default constructor X3.
stochastic_distribution(const stochastic_distribution &) noexcept=default
Move semantics.
const data::variable_list & variables() const
bool is_defined() const
Returns true if the distribution is defined, i.e. it contains a valid distribution....
stochastic_distribution(const data::variable_list &variables, const data::data_expression &distribution)
\brief Constructor Z12.
stochastic_distribution & operator=(const stochastic_distribution &) noexcept=default
stochastic_distribution(const atermpp::aterm &term)
const data::data_expression & distribution() const
stochastic_linear_process(const atermpp::aterm &t, bool stochastic_distributions_allowed=true)
Constructor.
stochastic_linear_process(const data::variable_list &process_parameters, const deadlock_summand_vector &deadlock_summands, const stochastic_action_summand_vector &action_summands)
Constructor.
stochastic_linear_process()=default
Constructor.
stochastic_linear_process(const linear_process &other)
Constructor.
stochastic_process_initializer(const atermpp::aterm &term)
Constructor.
stochastic_process_initializer(const data::data_expression_list &expressions, const stochastic_distribution &distribution)
Constructor.
const stochastic_distribution & distribution() const
stochastic_specification(const specification &other)
Constructor. This constructor is explicit as implicit conversions of this kind is a source of bugs.
stochastic_specification()=default
Constructor.
stochastic_specification(const data::data_specification &data, const process::action_label_list &action_labels, const std::set< data::variable > &global_variables, const stochastic_linear_process &lps, const stochastic_process_initializer &initial_process)
Constructor.
Base class for LPS summands.
Definition summand.h:22
const data::data_expression & condition() const
Returns the condition expression.
Definition summand.h:56
const data::variable_list & summation_variables() const
Returns the sequence of summation variables.
Definition summand.h:49
data::variable_list m_summation_variables
The summation variables of the summand.
Definition summand.h:25
data::data_expression & condition()
Returns the condition expression.
Definition summand.h:63
data::data_expression m_condition
The condition of the summand.
Definition summand.h:28
void swap(summand_base &other) noexcept
Swaps the contents.
Definition summand.h:69
data::variable_list & summation_variables()
Returns the sequence of summation variables.
Definition summand.h:42
summand_base(const data::variable_list &summation_variables, const data::data_expression &condition)
Constructor.
Definition summand.h:35
summand_base()=default
Constructor.
\brief An action label
const data::sort_expression_list & sorts() const
action_label()
\brief Default constructor X3.
action_label(const atermpp::aterm &term)
action_label & operator=(action_label &&) noexcept=default
action_label(const std::string &name, const data::sort_expression_list &sorts)
\brief Constructor Z1.
action_label(action_label &&) noexcept=default
const core::identifier_string & name() const
action_label & operator=(const action_label &) noexcept=default
action_label(const action_label &) noexcept=default
Move semantics.
action_label(const core::identifier_string &name, const data::sort_expression_list &sorts)
\brief Constructor Z12.
\brief A multiset of action names
action_name_multiset & operator=(action_name_multiset &&) noexcept=default
const core::identifier_string_list & names() const
action_name_multiset & operator=(const action_name_multiset &) noexcept=default
action_name_multiset(const atermpp::aterm &term)
Constructor from aterm.
action_name_multiset(const action_name_multiset &) noexcept=default
Move semantics.
action_name_multiset(action_name_multiset &&) noexcept=default
action_name_multiset(const core::identifier_string_list &names)
Constructor. Names are sorted lexicographically to establish the sorted-storage invariant.
action(const action_label &label, const data::data_expression_list &arguments)
\brief Constructor Z14.
action & operator=(action &&) noexcept=default
action()
\brief Default constructor X3.
action(const atermpp::aterm &term)
action(action &&) noexcept=default
action & operator=(const action &) noexcept=default
const data::data_expression_list & arguments() const
action(const action &) noexcept=default
Move semantics.
const action_label & label() const
\brief The allow operator
allow(const allow &) noexcept=default
Move semantics.
allow()
\brief Default constructor X3.
allow(const atermpp::aterm &term)
const process_expression & operand() const
allow(const action_name_multiset_list &allow_set, const process_expression &operand)
\brief Constructor Z14.
allow(allow &&) noexcept=default
const action_name_multiset_list & allow_set() const
allow & operator=(allow &&) noexcept=default
allow & operator=(const allow &) noexcept=default
\brief The at operator
at(at &&) noexcept=default
at(const atermpp::aterm &term)
at(const at &) noexcept=default
Move semantics.
at()
\brief Default constructor X3.
at & operator=(const at &) noexcept=default
at(const process_expression &operand, const data::data_expression &time_stamp)
\brief Constructor Z14.
const data::data_expression & time_stamp() const
at & operator=(at &&) noexcept=default
const process_expression & operand() const
\brief The block operator
block & operator=(block &&) noexcept=default
block & operator=(const block &) noexcept=default
const process_expression & operand() const
block(block &&) noexcept=default
block(const block &) noexcept=default
Move semantics.
block(const atermpp::aterm &term)
block(const core::identifier_string_list &block_set, const process_expression &operand)
Constructor. block_set is sorted lexicographically to establish the sorted-storage invariant.
const core::identifier_string_list & block_set() const
\brief The bounded initialization
bounded_init(const bounded_init &) noexcept=default
Move semantics.
bounded_init & operator=(const bounded_init &) noexcept=default
const process_expression & right() const
bounded_init(bounded_init &&) noexcept=default
bounded_init(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
bounded_init(const atermpp::aterm &term)
const process_expression & left() const
bounded_init()
\brief Default constructor X3.
bounded_init & operator=(bounded_init &&) noexcept=default
\brief The choice operator
choice(const atermpp::aterm &term)
choice & operator=(const choice &) noexcept=default
choice(const choice &) noexcept=default
Move semantics.
choice()
\brief Default constructor X3.
const process_expression & left() const
choice(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
choice(choice &&) noexcept=default
const process_expression & right() const
choice & operator=(choice &&) noexcept=default
\brief The communication operator
comm & operator=(const comm &) noexcept=default
comm(const atermpp::aterm &term)
comm(comm &&) noexcept=default
comm & operator=(comm &&) noexcept=default
comm(const comm &) noexcept=default
Move semantics.
const communication_expression_list & comm_set() const
comm(const communication_expression_list &comm_set, const process_expression &operand)
\brief Constructor Z14.
const process_expression & operand() const
comm()
\brief Default constructor X3.
const core::identifier_string & name() const
communication_expression()
\brief Default constructor X3.
communication_expression & operator=(const communication_expression &) noexcept=default
communication_expression(const action_name_multiset &action_name, const std::string &name)
\brief Constructor Z1.
communication_expression(const communication_expression &) noexcept=default
Move semantics.
communication_expression(communication_expression &&) noexcept=default
communication_expression & operator=(communication_expression &&) noexcept=default
communication_expression(const action_name_multiset &action_name, const core::identifier_string &name)
\brief Constructor Z12.
const action_name_multiset & action_name() const
\brief The value delta
delta & operator=(const delta &) noexcept=default
delta()
\brief Default constructor X3.
delta(const atermpp::aterm &term)
delta(delta &&) noexcept=default
delta(const delta &) noexcept=default
Move semantics.
delta & operator=(delta &&) noexcept=default
void add_context_action_labels(const ActionLabelContainer &actions, const data::sort_type_checker &sort_typechecker)
std::set< data::sort_expression_list > matching_action_sorts(const core::identifier_string &name) const
std::set< data::sort_expression_list > matching_action_sorts(const core::identifier_string &name, const data::data_expression_list &parameters) const
bool is_declared(const core::identifier_string &name) const
std::multimap< core::identifier_string, action_label > m_actions
bool is_matching_assignment(const data::untyped_identifier_assignment_list &assignments, const data::variable_list &parameters) const
bool is_declared(const core::identifier_string &name) const
process_instance make_process_instance(const core::identifier_string &name, const data::sort_expression_list &formal_parameters, const data::data_expression_list &actual_parameters) const
std::multimap< core::identifier_string, process_identifier > m_process_identifiers
process_identifier match_untyped_process_instance_assignment(const untyped_process_assignment &x) const
data::untyped_identifier_assignment find_violating_assignment(const data::untyped_identifier_assignment_list &assignments, const data::variable_list &parameters) const
void add_process_identifiers(const ProcessIdentifierContainer &ids, const action_context &action_ctx, const data::sort_type_checker &sort_typechecker)
std::set< data::sort_expression_list > matching_process_sorts(const core::identifier_string &name, const data::data_expression_list &parameters) const
\brief The hide operator
hide(hide &&) noexcept=default
hide(const atermpp::aterm &term)
hide(const core::identifier_string_list &hide_set, const process_expression &operand)
\brief Constructor Z14.
const core::identifier_string_list & hide_set() const
hide & operator=(const hide &) noexcept=default
const process_expression & operand() const
hide(const hide &) noexcept=default
Move semantics.
hide & operator=(hide &&) noexcept=default
hide()
\brief Default constructor X3.
\brief The if-then-else operator
const process_expression & else_case() const
if_then_else(if_then_else &&) noexcept=default
const process_expression & then_case() const
if_then_else(const atermpp::aterm &term)
if_then_else()
\brief Default constructor X3.
if_then_else & operator=(const if_then_else &) noexcept=default
if_then_else(const if_then_else &) noexcept=default
Move semantics.
const data::data_expression & condition() const
if_then_else & operator=(if_then_else &&) noexcept=default
if_then_else(const data::data_expression &condition, const process_expression &then_case, const process_expression &else_case)
\brief Constructor Z14.
\brief The if-then operator
const process_expression & then_case() const
if_then & operator=(const if_then &) noexcept=default
if_then(const data::data_expression &condition, const process_expression &then_case)
\brief Constructor Z14.
if_then(const atermpp::aterm &term)
const data::data_expression & condition() const
if_then(const if_then &) noexcept=default
Move semantics.
if_then & operator=(if_then &&) noexcept=default
if_then(if_then &&) noexcept=default
if_then()
\brief Default constructor X3.
\brief The left merge operator
left_merge(left_merge &&) noexcept=default
const process_expression & right() const
left_merge & operator=(left_merge &&) noexcept=default
left_merge(const atermpp::aterm &term)
left_merge & operator=(const left_merge &) noexcept=default
left_merge(const left_merge &) noexcept=default
Move semantics.
left_merge(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
const process_expression & left() const
left_merge()
\brief Default constructor X3.
\brief The merge operator
merge(const atermpp::aterm &term)
const process_expression & right() const
const process_expression & left() const
merge & operator=(const merge &) noexcept=default
merge(const merge &) noexcept=default
Move semantics.
merge(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
merge & operator=(merge &&) noexcept=default
merge(merge &&) noexcept=default
merge()
\brief Default constructor X3.
\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
process_equation & operator=(process_equation &&) noexcept=default
const process_identifier & identifier() const
const process_expression & expression() const
process_equation(process_equation &&) noexcept=default
process_equation & operator=(const process_equation &) noexcept=default
process_equation(const process_identifier &identifier, const data::variable_list &formal_parameters, const process_expression &expression)
\brief Constructor Z12.
process_equation(const atermpp::aterm &term)
\brief A process expression
process_expression & operator=(const process_expression &) noexcept=default
process_expression(const process_expression &) noexcept=default
Move semantics.
process_expression()
\brief Default constructor X3.
process_expression(const data::untyped_data_parameter &x)
\brief Constructor Z6.
process_expression(process_expression &&) noexcept=default
process_expression(const atermpp::aterm &term)
process_expression & operator=(process_expression &&) noexcept=default
\brief A process identifier
process_identifier(const process_identifier &) noexcept=default
Move semantics.
const data::variable_list & variables() const
process_identifier & operator=(const process_identifier &) noexcept=default
process_identifier(process_identifier &&) noexcept=default
process_identifier(const core::identifier_string &name, const data::variable_list &variables)
Constructor.
const core::identifier_string & name() const
process_identifier & operator=(process_identifier &&) noexcept=default
process_identifier(const std::string &name, const data::variable_list &variables)
Constructor.
process_identifier(const atermpp::aterm &term)
Constructor.
process_instance_assignment(const process_instance_assignment &) noexcept=default
Move semantics.
process_instance_assignment()
\brief Default constructor X3.
process_instance_assignment(const process_identifier &identifier, const data::assignment_list &assignments)
\brief Constructor Z14.
process_instance_assignment & operator=(const process_instance_assignment &) noexcept=default
process_instance_assignment(process_instance_assignment &&) noexcept=default
const data::assignment_list & assignments() const
process_instance_assignment(const atermpp::aterm &term)
process_instance_assignment & operator=(process_instance_assignment &&) noexcept=default
const process_identifier & identifier() const
const data::data_expression_list & actual_parameters() const
process_instance(const process_identifier &identifier, const data::data_expression_list &actual_parameters)
\brief Constructor Z14.
process_instance & operator=(const process_instance &) noexcept=default
process_instance & operator=(process_instance &&) noexcept=default
const process_identifier & identifier() const
process_instance(process_instance &&) noexcept=default
process_instance()
\brief Default constructor X3.
process_instance(const atermpp::aterm &term)
process_instance(const process_instance &) noexcept=default
Move semantics.
Process specification consisting of a data specification, action labels, a sequence of process equati...
const std::vector< process_equation > & equations() const
Returns the equations of the process specification.
process_specification(data::data_specification data, process::action_label_list action_labels, process_equation_list equations, process_expression init)
Constructor that sets the global variables to empty;.
process::action_label_list m_action_labels
The action specification of the specification.
process_specification()=default
Constructor.
process_expression & init()
Returns the initialization of the process specification.
const process_expression & init() const
Returns the initialization of the process specification.
process_specification(data::data_specification data, process::action_label_list action_labels, data::variable_list global_variables, process_equation_list equations, process_expression init)
Constructor of a process specification.
std::vector< process_equation > & equations()
Returns the equations of the process specification.
process_specification(atermpp::aterm t)
Constructor.
std::set< data::variable > m_global_variables
The set of global variables.
std::vector< process_equation > m_equations
The equations of the specification.
const process::action_label_list & action_labels() const
Returns the action label specification.
data::data_specification m_data
The data specification of the specification.
process_expression m_initial_process
The initial state of the specification.
process::action_label_list & action_labels()
Returns the action label specification.
const std::set< data::variable > & global_variables() const
Returns the declared free variables of the process specification.
void construct_from_aterm(const atermpp::aterm &t)
Initializes the specification with an aterm.
std::set< data::variable > & global_variables()
Returns the declared free variables of the process specification.
data::data_type_checker m_data_type_checker
Definition typecheck.h:637
process_expression typecheck_process_expression(const data::detail::variable_context &variables, const process_expression &x, const process_identifier *current_equation=nullptr)
Definition typecheck.h:718
detail::action_context m_action_context
Definition typecheck.h:638
data::detail::variable_context m_variable_context
Definition typecheck.h:640
process_type_checker(const data::data_specification &dataspec=data::data_specification())
Default constructor.
Definition typecheck.h:667
void operator()(process_specification &procspec)
Typecheck the process specification procspec.
Definition typecheck.h:682
static std::vector< process_identifier > equation_identifiers(const std::vector< process_equation > &equations)
Definition typecheck.h:642
detail::process_context m_process_context
Definition typecheck.h:639
process_type_checker(const data::data_specification &dataspec, const VariableContainer &variables, const ActionLabelContainer &action_labels, const ProcessIdentifierContainer &process_identifiers)
Definition typecheck.h:654
process_expression operator()(const process_expression &x, const process_identifier *current_equation=nullptr)
Type check a process expression. Throws a mcrl2::runtime_error exception if the expression is not wel...
Definition typecheck.h:676
\brief A rename expression
const core::identifier_string & source() const
rename_expression()
\brief Default constructor X3.
rename_expression & operator=(rename_expression &&) noexcept=default
rename_expression & operator=(const rename_expression &) noexcept=default
rename_expression(core::identifier_string &source, core::identifier_string &target)
\brief Constructor Z12.
const core::identifier_string & target() const
rename_expression(const atermpp::aterm &term)
rename_expression(rename_expression &&) noexcept=default
rename_expression(const std::string &source, const std::string &target)
\brief Constructor Z1.
rename_expression(const rename_expression &) noexcept=default
Move semantics.
\brief The rename operator
rename(const atermpp::aterm &term)
rename & operator=(const rename &) noexcept=default
rename(const rename &) noexcept=default
Move semantics.
rename()
\brief Default constructor X3.
const process_expression & operand() const
rename & operator=(rename &&) noexcept=default
rename(rename &&) noexcept=default
rename(const rename_expression_list &rename_set, const process_expression &operand)
\brief Constructor Z14.
const rename_expression_list & rename_set() const
\brief The sequential composition
seq & operator=(seq &&) noexcept=default
const process_expression & right() const
seq(const atermpp::aterm &term)
seq()
\brief Default constructor X3.
seq & operator=(const seq &) noexcept=default
const process_expression & left() const
seq(seq &&) noexcept=default
seq(const seq &) noexcept=default
Move semantics.
seq(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
\brief The distribution operator
const data::variable_list & variables() const
const data::data_expression & distribution() const
stochastic_operator & operator=(stochastic_operator &&) noexcept=default
stochastic_operator()
\brief Default constructor X3.
stochastic_operator(const atermpp::aterm &term)
stochastic_operator(stochastic_operator &&) noexcept=default
stochastic_operator(const stochastic_operator &) noexcept=default
Move semantics.
stochastic_operator & operator=(const stochastic_operator &) noexcept=default
const process_expression & operand() const
stochastic_operator(const data::variable_list &variables, const data::data_expression &distribution, const process_expression &operand)
\brief Constructor Z14.
\brief The sum operator
const process_expression & operand() const
sum(const data::variable_list &variables, const process_expression &operand)
\brief Constructor Z14.
sum(const atermpp::aterm &term)
sum & operator=(sum &&) noexcept=default
sum()
\brief Default constructor X3.
const data::variable_list & variables() const
sum(sum &&) noexcept=default
sum(const sum &) noexcept=default
Move semantics.
sum & operator=(const sum &) noexcept=default
\brief The synchronization operator
sync & operator=(const sync &) noexcept=default
sync(sync &&) noexcept=default
sync(const sync &) noexcept=default
Move semantics.
const process_expression & left() const
sync()
\brief Default constructor X3.
sync & operator=(sync &&) noexcept=default
sync(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
const process_expression & right() const
sync(const atermpp::aterm &term)
\brief The value tau
tau(const tau &) noexcept=default
Move semantics.
tau()
\brief Default constructor X3.
tau(const atermpp::aterm &term)
tau & operator=(tau &&) noexcept=default
tau & operator=(const tau &) noexcept=default
tau(tau &&) noexcept=default
\brief An untyped multi action or data application
untyped_multi_action(const data::untyped_data_parameter_list &actions)
\brief Constructor Z12.
untyped_multi_action & operator=(untyped_multi_action &&) noexcept=default
untyped_multi_action(untyped_multi_action &&) noexcept=default
untyped_multi_action & operator=(const untyped_multi_action &) noexcept=default
const data::untyped_data_parameter_list & actions() const
untyped_multi_action(const atermpp::aterm &term)
untyped_multi_action()
\brief Default constructor X3.
untyped_multi_action(const untyped_multi_action &) noexcept=default
Move semantics.
\brief An untyped process assginment
untyped_process_assignment & operator=(untyped_process_assignment &&) noexcept=default
const data::untyped_identifier_assignment_list & assignments() const
untyped_process_assignment(const core::identifier_string &name, const data::untyped_identifier_assignment_list &assignments)
\brief Constructor Z14.
untyped_process_assignment(const atermpp::aterm &term)
const core::identifier_string & name() const
untyped_process_assignment()
\brief Default constructor X3.
untyped_process_assignment & operator=(const untyped_process_assignment &) noexcept=default
untyped_process_assignment(const std::string &name, const data::untyped_identifier_assignment_list &assignments)
\brief Constructor Z2.
untyped_process_assignment(untyped_process_assignment &&) noexcept=default
untyped_process_assignment(const untyped_process_assignment &) noexcept=default
Move semantics.
process_expression processbody
objectdatatype(const objectdatatype &o)=default
process_expression representedprocess
~objectdatatype()=default
process::action_label_list multi_action_names
processstatustype processstatus
identifier_string objectname
std::set< variable > get_free_variables() const
objectdatatype()=default
objectdatatype & operator=(const objectdatatype &o)=default
objecttype object
process_identifier process_representing_action
variable_list parameters
enumeratedtype(const enumeratedtype &e)
enumeratedtype(const std::size_t n, specification_basic_type &spec)
enumeratedtype & operator=(const enumeratedtype &e)=default
enumtype(const enumtype &)=delete
enumtype & operator=(const enumtype &)=delete
enumtype(std::size_t n, const sort_expression_list &fsorts, const sort_expression_list &gsorts, specification_basic_type &spec)
process_pid_pair & operator=(const process_pid_pair &other)=default
const process_expression & process_body() const
const process_identifier & process_id() const
process_pid_pair(const process_pid_pair &other)=default
process_pid_pair & operator=(process_pid_pair &&other)=default
process_pid_pair(const process_expression &process_body, const process_identifier &pid)
process_pid_pair(process_pid_pair &&other)=default
static stackoperations * find_suitable_stack_operations(const variable_list &parameters, stackoperations *stack_operations_list)
stacklisttype & operator=(const stacklisttype &)=delete
stacklisttype(const variable_list &parlist, specification_basic_type &spec, const bool regular, const std::set< process_identifier > &pCRLprocs, const bool singlecontrolstate)
Constructor.
stacklisttype(const stacklisttype &)=delete
stackoperations & operator=(const stackoperations &)=delete
stackoperations(const stackoperations &)=delete
stackoperations(const variable_list &pl, specification_basic_type &spec)
process_expression procstorealGNFbody(const process_expression &body, variableposition v, std::vector< process_identifier > &todo, const bool regular, processstatustype mode, const variable_list &freevars, const std::set< variable > &variables_bound_in_sum)
data_expression construct_binary_case_tree(std::size_t n, const variable_list &sums, data_expression_list terms, const sort_expression &termsort, const enumtype &e)
data::maintain_variables_in_rhs< data::mutable_map_substitution<> > make_unique_variables(const variable_list &var_list, const std::string &hint)
variable_list parscollect(const process_expression &oldbody, process_expression &newbody)
stochastic_action_summand collect_sum_arg_arg_cond(const enumtype &e, const stochastic_action_summand_vector &action_summands, const variable_list &parameters)
action_list linMergeMultiActionList(const action_list &ma1, const action_list &ma2)
void generateLPEpCRL(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process_identifier &procId, const bool containstime, const bool regular, variable_list &parameters, data_expression_list &init, stochastic_distribution &initial_stochastic_distribution)
variable get_fresh_variable(const std::string &s, const sort_expression &sort, const int reuse_index=-1)
process_expression distributeActionOverConditions(const process_expression &act, const data_expression &condition, const process_expression &restterm, const variable_list &freevars, const std::set< variable > &variables_bound_in_sum)
data_expression construct_binary_case_tree_rec(std::size_t n, const variable_list &sums, data_expression_list &terms, const sort_expression &termsort, const enumtype &e)
static void complete_proc_identifier_map(std::map< process_identifier, process_identifier > &identifier_identifier_map)
process_expression to_regular_form(const process_expression &t, std::vector< process_identifier > &todo, const variable_list &freevars, const std::set< variable > &variables_bound_in_sum)
void collectsumlistterm(const process_identifier &procId, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process_expression &body, const variable_list &pars, const stacklisttype &stack, const bool regular, const bool singlestate, const std::set< process_identifier > &pCRLprocs)
data_expression_list findarguments(const variable_list &pars, const variable_list &parlist, const assignment_list &args, const data_expression_list &t2, const stacklisttype &stack, const variable_list &vars, const std::set< variable > &free_variables_in_body, const variable_list &stochastic_variables)
void calculate_communication_merge(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const stochastic_action_summand_vector &action_summands2, const deadlock_summand_vector &deadlock_summands2, const action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
void insertvariable(const variable &var, const bool mustbenew)
process_identifier storeinit(const process_expression &init)
static action_list to_sorted_action_list(const process_expression &p)
Convert the process expression to a sorted action list.
process_expression pCRLrewrite(const process_expression &t)
data_expression_list pushdummy_regular_data_expressions(const variable_list &pars, const stacklisttype &stack)
void define_equations_for_case_function(const std::size_t index, const data::function_symbol &functionname, const sort_expression &sort)
void alphaconvert(variable_list &sumvars, MutableSubstitution &sigma, const variable_list &occurvars, const data_expression_list &occurterms)
bool canterminatebody(const process_expression &t)
data_expression transform_matching_list(const variable_list &matchinglist)
void add_summands(const process_identifier &procId, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, process_expression summandterm, const std::set< process_identifier > &pCRLprocs, const stacklisttype &stack, const bool regular, const bool singlestate, const variable_list &process_parameters)
bool isDeltaAtZero(const process_expression &t)
data::function_symbol find_case_function(std::size_t index, const sort_expression &sort) const
data_expression_list make_initialstate(const process_identifier &initialProcId, const stacklisttype &stack, const std::set< process_identifier > &pcrlprcs, const bool regular, const bool singlecontrolstate, const stochastic_distribution &initial_stochastic_distribution)
static bool summandsCanBeClustered(const stochastic_action_summand &summand1, const stochastic_action_summand &summand2)
static sort_expression_list getActionSorts(const action_list &actionlist)
void filter_vars_by_multiaction(const action_list &multiaction, const std::set< variable > &vars_set, std::set< variable > &vars_result_set)
static process_identifier get_last(const process_identifier &id, const std::map< process_identifier, process_identifier > &identifier_identifier_map)
static bool check_real_variable_occurrence(const variable_list &sumvars, const data_expression &actiontime, const data_expression &condition)
process_identifier newprocess(const variable_list &parameters, const process_expression &body, const processstatustype ps, const bool canterminate, const bool containstime)
void make_pCRL_procs(const process_identifier &id, std::set< process_identifier > &reachable_process_identifiers)
void filter_vars_by_term(const data_expression &t, const std::set< variable > &vars_set, std::set< variable > &vars_result_set)
data_expression_list pushdummy_stack(const variable_list &parameters, const stacklisttype &stack, const variable_list &stochastic_variables)
void procstorealGNFrec(const process_identifier &procIdDecl, const variableposition v, std::vector< process_identifier > &todo, const bool regular)
static action_label_list getnames(const process_expression &multiAction)
variable_list getparameters_rec(const process_expression &multiAction, std::set< variable > &occurs_set)
static int match_sequence(const std::vector< process_instance_assignment > &s1, const std::vector< process_instance_assignment > &s2, const bool regular2)
assignment_list argscollect_regular2(const process_expression &t, variable_list &vl)
assignment_list make_optimised_assignment_list(const variable_list &parameters, const data_expression_list &resultnextstate, const variable_list &sum_vars, const variable_list &stoch_vars)
void calculate_left_merge_action(const lps::detail::ultimate_delay &ultimate_delay_condition, const stochastic_action_summand_vector &action_summands1, const action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands)
process_expression split_body(const process_expression &t, std::map< process_identifier, process_identifier > &visited_id, std::map< process_expression, process_expression > &visited_proc, const variable_list &parameters)
void parallelcomposition(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const variable_list &pars1, const data_expression_list &init1, const stochastic_distribution &initial_stochastic_distribution1, const lps::detail::ultimate_delay &ultimate_delay_condition1, const stochastic_action_summand_vector &action_summands2, const deadlock_summand_vector &deadlock_summands2, const variable_list &pars2, const data_expression_list &init2, const stochastic_distribution &initial_stochastic_distribution2, const lps::detail::ultimate_delay &ultimate_delay_condition2, const action_name_multiset_list &allowlist1, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, variable_list &pars_result, data_expression_list &init_result, stochastic_distribution &initial_stochastic_distribution, lps::detail::ultimate_delay &ultimate_delay_condition)
bool occursintermlist(const variable &var, const assignment_list &r, const process_identifier &proc_name) const
void transform_process_arguments(const process_identifier &procId)
objectdatatype & insert_process_declaration(const process_identifier &procId, const variable_list &parameters, const process_expression &body, processstatustype s, const bool canterminate, const bool containstime)
static void set_proc_identifier_map(std::map< process_identifier, process_identifier > &identifier_identifier_map, const process_identifier &id1_, const process_identifier &id2_, const process_identifier &initial_process)
bool canterminate_rec(const process_identifier &procId, bool &stable, std::set< process_identifier > &visited)
set_identifier_generator fresh_identifier_generator
std::set< process_identifier > remove_stochastic_operators_from_front(const std::set< process_identifier > &reachable_process_identifiers, process_identifier &initial_process_id, stochastic_distribution &initial_stochastic_distribution)
void filter_vars_by_termlist(Iterator begin, const Iterator &end, const std::set< variable > &vars_set, std::set< variable > &vars_result_set)
bool searchProcDeclaration(const variable_list &parameters, const process_expression &body, const processstatustype s, const bool canterminate, const bool containstime, process_identifier &p) const
process_identifier splitmCRLandpCRLprocsAndAddTerminatedAction(const process_identifier &procId)
action_list linMergeMultiActionListProcess(const process_expression &ma1, const process_expression &ma2)
std::vector< process_equation > procs
action_list adapt_multiaction_to_stack(const action_list &multiAction, const stacklisttype &stack, const variable_list &vars)
void determinewhetherprocessescanterminate(const process_identifier &procId)
process_expression distribute_condition(const process_expression &body1, const data_expression &condition)
bool containstime_rec(const process_identifier &procId, bool *stable, std::set< process_identifier > &visited, bool &contains_if_then)
void collectsumlist(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const std::set< process_identifier > &pCRLprocs, const variable_list &pars, const stacklisttype &stack, bool regular, bool singlestate)
data_expression correctstatecond(const process_identifier &procId, const std::set< process_identifier > &pCRLproc, const stacklisttype &stack, int regular)
void calculate_communication_merge_action_summands(const stochastic_action_summand_vector &action_summands1, const stochastic_action_summand_vector &action_summands2, const action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands)
processstatustype determine_process_statusterm(const process_expression &body, const processstatustype status)
void calculate_communication_merge_action_deadlock_summands(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
data_expression getvar(const variable &var, const stacklisttype &stack) const
variable_list initdatavars
lps::detail::ultimate_delay combine_ultimate_delays(const lps::detail::ultimate_delay &delay1, const lps::detail::ultimate_delay &delay2)
Returns the conjunction of the two delay conditions and the join of the variables,...
process_expression distributeTime(const process_expression &body, const data_expression &time, const variable_list &freevars, data_expression &timecondition)
data_expression_list pushdummyrec_stack(const variable_list &totalpars, const variable_list &pars, const stacklisttype &stack, const variable_list &stochastic_variables)
static action_list to_action_list(const process_expression &p)
std::set< data::variable > sigma_variables(const Substitution &sigma)
void combine_summand_lists(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const lps::detail::ultimate_delay &ultimate_delay_condition1, const stochastic_action_summand_vector &action_summands2, const deadlock_summand_vector &deadlock_summands2, const lps::detail::ultimate_delay &ultimate_delay_condition2, const variable_list &par1, const variable_list &par3, const action_name_multiset_list &allowlist1, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
process_expression cut_off_unreachable_tail(const process_expression &t)
std::vector< enumeratedtype > enumeratedtypes
data_expression find_(const variable &s, const assignment_list &args, const stacklisttype &stack, const variable_list &vars, const std::set< variable > &free_variables_in_body, const variable_list &stochastic_variables)
process::action_label_list acts
assignment_list make_procargs_regular(const process_expression &t, const stacklisttype &stack, const std::set< process_identifier > &pcrlprcs, const bool singlestate, const variable_list &stochastic_variables)
std::size_t create_enumeratedtype(const std::size_t n)
void generateLPEmCRL(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process_identifier &procIdDecl, const bool regular, variable_list &pars, data_expression_list &init, stochastic_distribution &initial_stochastic_distribution, lps::detail::ultimate_delay &ultimate_delay_condition)
process_instance_assignment expand_process_instance_assignment(const process_instance_assignment &t)
static process_expression delta_at_zero()
assignment_list rewrite_assignments(const assignment_list &t)
assignment_list push_regular(const process_identifier &procId, const assignment_list &args, const stacklisttype &stack, const std::set< process_identifier > &pCRLprocs, bool singlestate, const variable_list &stochastic_variables)
void transform_process_arguments(const process_identifier &procId, std::set< process_identifier > &visited_processes)
std::set< process_identifier > minimize_set_of_reachable_process_identifiers(const std::set< process_identifier > &reachable_process_identifiers, const process_identifier &initial_process)
void collectPcrlProcesses(const process_identifier &procDecl, std::vector< process_identifier > &pcrlprocesses, std::set< process_identifier > &visited)
variable_list make_binary_sums(std::size_t n, const sort_expression &enumtypename, data_expression &condition, const variable_list &tail)
variable_list SieveProcDataVarsAssignments(const std::set< variable > &vars, const data_expression_list &initial_state_expressions)
data_expression_list extend_conditions(const variable &var, const data_expression_list &conditionlist)
bool check_valid_process_instance_assignment(const process_identifier &id, const assignment_list &assignments)
void calculate_left_merge_deadlock(const lps::detail::ultimate_delay &ultimate_delay_condition, const deadlock_summand_vector &deadlock_summands1, const bool is_allow, const bool is_block, const stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
void addString(const identifier_string &str)
void procstovarheadGNF(const std::vector< process_identifier > &procs)
static process_expression action_list_to_process(const action_list &ma)
process_expression distribute_sum_over_a_stochastic_operator(const variable_list &sumvars, const variable_list &stochastic_variables, const data_expression &distribution, const process_expression &body)
void alphaconvertprocess(variable_list &sumvars, MutableSubstitution &sigma, const process_expression &p)
process_expression obtain_initial_distribution_term(const process_expression &t)
data_expression push_stack(const process_identifier &procId, const assignment_list &args, const data_expression_list &t2, const stacklisttype &stack, const std::set< process_identifier > &pCRLprocs, const variable_list &vars, const variable_list &stochastic_variables)
void calculate_left_merge(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const lps::detail::ultimate_delay &ultimate_delay_condition2, const action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
void declare_control_state(const std::set< process_identifier > &pCRLprocs)
void create_case_function_on_enumeratedtype(const sort_expression &sort, const std::size_t enumeratedtype_index)
variable_list SieveProcDataVarsSummands(const std::set< variable > &vars, const stochastic_action_summand_vector &action_summands, const deadlock_summand_vector &deadlock_summands, const variable_list &parameters)
static data_expression_list extend(const data_expression &c, const data_expression_list &cl)
specification_basic_type & operator=(const specification_basic_type &)=delete
static bool occursinvarandremove(const variable &var, variable_list &vl)
process_expression bodytovarheadGNF(const process_expression &body, const state s, const variable_list &freevars, const variableposition v, const std::set< variable > &variables_bound_in_sum)
process_identifier terminatedProcId
process_expression distribute_sum(const variable_list &sumvars, const process_expression &body1)
data_expression variables_are_equal_to_default_values(const variable_list &vl)
void procstorealGNF(const process_identifier &procsIdDecl, const bool regular)
static bool check_assignment_list(const assignment_list &assignments, const variable_list &parameters)
data_expression RewriteTerm(const data_expression &t)
void alphaconversion(const process_identifier &procId, const variable_list &parameters)
bool all_equal(const atermpp::term_list< T > &l)
void cluster_actions(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const variable_list &pars)
process_expression transform_initial_distribution_term(const process_expression &t, const std::map< process_identifier, process_pid_pair > &processes_with_initial_distribution)
process_expression create_regular_invocation(process_expression sequence, std::vector< process_identifier > &todo, const variable_list &freevars, const std::set< variable > &variables_bound_in_sum)
process_expression transform_process_arguments_body(const process_expression &t, const std::set< variable > &bound_variables, std::set< process_identifier > &visited_processes)
static assignment_list parameters_to_assignment_list(const variable_list &parameters, const std::set< variable > &variables_bound_in_sum)
assignment_list dummyparameterlist(const stacklisttype &stack, const bool singlestate)
mcrl2::data::rewriter rewr
void make_pCRL_procs(const process_expression &t, std::set< process_identifier > &reachable_process_identifiers)
stackoperations * stack_operations_list
process_expression wraptime(const process_expression &body, const data_expression &time, const variable_list &freevars)
objectdatatype & objectIndex(const process_identifier &o)
process_identifier split_process(const process_identifier &procId, std::map< process_identifier, process_identifier > &visited_id, std::map< process_expression, process_expression > &visited_proc)
bool mergeoccursin(variable &var, const variable_list &v, variable_list &matchinglist, variable_list &pars, data_expression_list &args, const variable_list &process_parameters)
static bool occursintermlist(const variable &var, const data_expression_list &r)
bool exists_variable_for_sequence(const std::vector< process_instance_assignment > &process_names, process_identifier &result)
std::set< variable > find_free_variables_process(const process_expression &p)
process_expression alphaconversionterm(const process_expression &t, const variable_list &parameters, maintain_variables_in_rhs< mutable_map_substitution<> > sigma)
process_expression putbehind(const process_expression &body1, const process_expression &body2)
assignment_list substitute_assignmentlist(const assignment_list &assignments, const variable_list &parameters, const bool replacelhs, const bool replacerhs, Substitution &sigma)
process_instance_assignment transform_process_instance_to_process_instance_assignment(const process_instance &procId, const std::set< variable > &bound_variables=std::set< variable >())
process_instance_assignment RewriteProcess(const process_instance_assignment &t)
process_identifier delta_process
const objectdatatype & objectIndex(const process_identifier &o) const
void insert_summand(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const variable_list &sumvars, const data_expression &condition, const action_list &multiAction, const data_expression &actTime, const stochastic_distribution &distribution, const assignment_list &procargs, const bool has_time, const bool is_deadlock_summand)
bool alreadypresent(variable &var, const variable_list &vl, mutable_indexed_substitution<> &parameter_renaming)
variable_list parameters_that_occur_in_body(const variable_list &parameters, const process_expression &body)
process_expression enumerate_distribution_and_sums(const variable_list &sumvars, const variable_list &stochvars, const data_expression &distribution, const process_expression &body)
bool containstimebody(const process_expression &t)
assignment_list make_procargs(const process_expression &t, const stacklisttype &stack, const std::set< process_identifier > &pcrlprcs, const variable_list &vars, const bool regular, const bool singlestate, const variable_list &stochastic_variables)
data_expression adapt_term_to_stack(const data_expression &t, const stacklisttype &stack, const variable_list &vars, const variable_list &stochastic_variables)
data_expression_list processencoding(std::size_t i, const data_expression_list &t1, const stacklisttype &stack)
process_expression RewriteMultAct(const process_expression &t)
void generateLPEmCRLterm(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process_expression &t, const bool regular, const bool rename_variables, variable_list &pars, data_expression_list &init, stochastic_distribution &initial_stochastic_distribution, lps::detail::ultimate_delay &ultimate_delay_condition)
Linearise a process indicated by procIdDecl.
variable_list make_pars(const sort_expression_list &sortlist)
specification_basic_type(const specification_basic_type &)=delete
static data_expression real_times_optimized(const data_expression &r1, const data_expression &r2)
bool occursinpCRLterm(const variable &var, const process_expression &p, const bool strict)
void collectPcrlProcesses(const process_identifier &procDecl, std::vector< process_identifier > &pcrlprocesses)
static std::size_t upperpowerof2(std::size_t i)
void extract_names(const process_expression &sequence, std::vector< process_instance_assignment > &result)
std::map< aterm, objectdatatype > objectdata
action RewriteAction(const action &t)
data_expression_vector adapt_termlist_to_stack(Iterator begin, const Iterator &end, const stacklisttype &stack, const variable_list &vars, const variable_list &stochastic_variables)
data_expression make_procargs_stack(const process_expression &t, const stacklisttype &stack, const std::set< process_identifier > &pcrlprcs, const variable_list &vars, const variable_list &stochastic_variables)
specification_basic_type(const process::action_label_list &as, const std::vector< process_equation > &ps, const variable_list &idvs, const data_specification &ds, const std::set< data::variable > &glob_vars, const t_lin_options &opt, const process_specification &procspec)
variable_list getparameters(const process_expression &multiAction)
data_expression makesingleultimatedelaycondition(const variable_list &sumvars, const variable_list &freevars, const data_expression &condition, const bool has_time, const variable &timevariable, const data_expression &actiontime, variable_list &used_sumvars)
void collectPcrlProcesses_term(const process_expression &body, std::vector< process_identifier > &pcrlprocesses, std::set< process_identifier > &visited)
data_expression representative_generator_internal(const sort_expression &s, const bool allow_dont_care_var=true)
assignment_list processencoding(std::size_t i, const assignment_list &t1, const stacklisttype &stack)
objectdatatype & addMultiAction(const process_expression &multiAction, bool &isnew)
void storeprocs(const std::vector< process_equation > &procs)
process_expression substitute_pCRLproc(const process_expression &p, Substitution &sigma)
void make_parameters_and_sum_variables_unique(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, variable_list &pars, lps::detail::ultimate_delay &ultimate_delay_condition, const std::string &hint="")
std::set< variable > global_variables
static data_expression getRHSassignment(const variable &var, const assignment_list &as)
variable_list construct_renaming(const variable_list &pars1, const variable_list &pars2, variable_list &pars3, variable_list &pars4, const bool unique=true)
void determine_process_status(const process_identifier &procDecl, const processstatustype status)
static action_list makemultiaction(const process::action_label_list &actionIds, const data_expression_list &args)
void insertvariables(const variable_list &vars, const bool mustbenew)
variable_list collectparameterlist(std::set< process_identifier > &pCRLprocs)
data_expression_list RewriteTermList(const data_expression_list &t)
data_specification data
variable_list make_parameters_rec(const data_expression_list &l, std::set< variable > &occurs_set)
void detail_check_objectdata(const process_identifier &o) const
static assignment_list filter_assignments(const assignment_list &assignments, const variable_list &parameters)
variable_list merge_var(const variable_list &v1, const variable_list &v2, std::vector< variable_list > &renamings_pars, std::vector< data_expression_list > &renamings_args, data_expression_list &conditionlist, const variable_list &process_parameters)
bool containstimebody(const process_expression &t, bool *stable, std::set< process_identifier > &visited, bool allowrecursion, bool &contains_if_then)
static assignment_list sort_assignments(const assignment_list &ass, const variable_list &parameters)
assignment_list find_dummy_arguments(const variable_list &parlist, const assignment_list &args, const std::set< variable > &free_variables_in_body, const variable_list &stochastic_variables)
process_identifier tau_process
static sort_expression_list get_sorts(const List &l)
std::vector< process_identifier > seq_varnames
void storeact(const process::action_label_list &acts)
bool is_global_variable(const data_expression &d) const
variable_list joinparameters(const variable_list &par1, const variable_list &par2, mutable_indexed_substitution<> &parameter_renaming)
static bool occursin(const variable &name, const variable_list &pars)
bool canterminatebody(const process_expression &t, bool &stable, std::set< process_identifier > &visited, const bool allowrecursion)
void AddTerminationActionIfNecessary(const stochastic_action_summand_vector &summands)
bool determinewhetherprocessescontaintime(const process_identifier &procId)
void filter_vars_by_assignmentlist(const assignment_list &assignments, const variable_list &parameters, const std::set< variable > &vars_set, std::set< variable > &vars_result_set)
data_expression_list addcondition(const variable_list &matchinglist, const data_expression_list &conditionlist)
void calculate_communication_merge_deadlock_summands(const deadlock_summand_vector &deadlock_summands1, const deadlock_summand_vector &deadlock_summands2, const stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
void transform(const process_identifier &init, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, variable_list &parameters, data_expression_list &initial_state, stochastic_distribution &initial_stochastic_distribution)
process_expression obtain_initial_distribution(const process_identifier &procId)
objectdatatype & insertAction(const action_label &actionId)
Expression replace_variables_capture_avoiding_alt(const Expression &e, Substitution &sigma)
process_instance_assignment expand_process_instance_assignment(const process_instance_assignment &t, std::set< process_identifier > &visited_processes)
assignment_list pushdummy_regular(const variable_list &pars, const stacklisttype &stack, const variable_list &stochastic_variables)
assignment_list argscollect_regular(const process_expression &t, const variable_list &vl, const std::set< variable > &variables_bound_in_sum)
static data_expression_list getarguments(const action_list &multiAction)
lps::detail::ultimate_delay getUltimateDelayCondition(const stochastic_action_summand_vector &action_summands, const deadlock_summand_vector &deadlock_summands, const variable_list &freevars)
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
Definition logger.h:435
void split_condition(const data_expression &e, std::vector< data_expression_list > &real_conditions, std::vector< data_expression > &non_real_conditions)
This function first splits the given condition e into real conditions and non real conditions.
data_expression parse_data_expression(const std::string &text)
Definition data.cpp:217
lhs_t map_to_lhs_type(const map_based_lhs_t &lhs, const data_expression &factor, const rewriter &r)
data_expression negate_inequality(const data_expression &e)
data_specification parse_data_specification_new(const std::string &text)
Definition data.cpp:228
rewrite_data_expressions_with_substitution_builder< Builder, Rewriter, Substitution > make_rewrite_data_expressions_with_substitution_builder(Rewriter R, Substitution sigma)
Definition rewrite.h:78
rewrite_data_expressions_builder< Builder, Rewriter > make_rewrite_data_expressions_builder(Rewriter R)
Definition rewrite.h:47
variable_list parse_variable_declaration_list(const std::string &text)
Definition data.cpp:239
variable_list parse_variables(const std::string &text)
Definition data.cpp:206
lhs_t map_to_lhs_type(const map_based_lhs_t &lhs)
std::string pp(const detail::comparison_t t)
lhs_t set_factor_for_a_variable(const lhs_t &lhs, const variable &x, const data_expression &e)
static data_specification const & default_specification()
Definition parse.h:28
const data_expression & else_part(const data_expression &e)
bool is_well_formed(const lhs_t &lhs)
bool is_inequality(const data_expression &e)
Determine whether a data expression is an inequality.
detail::comparison_t negate(const detail::comparison_t t)
const data_expression & condition_part(const data_expression &e)
lhs_t remove_variable_and_divide(const lhs_t &lhs, const variable &v, const data_expression &f, const rewriter &r)
std::string pp(const detail::lhs_t &lhs)
const data_expression & then_part(const data_expression &e)
static bool split_condition_aux(const data_expression &e, std::vector< data_expression_list > &real_conditions, std::vector< data_expression_list > &non_real_conditions, const bool negate=false)
Splits a condition in expressions ranging over reals and the others.
void set_factor_for_a_variable(detail::map_based_lhs_t &new_lhs, const variable &x, const data_expression &e)
atermpp::function_symbol f_variable_with_a_rational_factor()
sort_expression parse_sort_expression(const std::string &text)
Definition data.cpp:196
A collection of utilities for lazy expression construction.
data_expression not_(data_expression const &p)
Returns an expression equivalent to not p.
data_expression and_(data_expression const &p, data_expression const &q)
Returns an expression equivalent to p or q.
Namespace for system defined sort bool_.
Definition bool.h:29
bool is_or_application(const atermpp::aterm &e)
Recogniser for application of ||.
Definition bool.h:342
const basic_sort & bool_()
Constructor for sort expression Bool.
Definition bool.h:41
const data_expression & right(const data_expression &e)
Function for projecting out argument. right from an application.
Definition bool.h:490
bool is_implies_application(const atermpp::aterm &e)
Recogniser for application of =>.
Definition bool.h:406
application not_(const data_expression &arg0)
Application of function symbol !.
Definition bool.h:194
application or_(const data_expression &arg0, const data_expression &arg1)
Application of function symbol ||.
Definition bool.h:321
const function_symbol & false_()
Constructor for function symbol false.
Definition bool.h:106
bool is_and_application(const atermpp::aterm &e)
Recogniser for application of &&.
Definition bool.h:278
bool is_not_application(const atermpp::aterm &e)
Recogniser for application of !.
Definition bool.h:214
const function_symbol & true_()
Constructor for function symbol true.
Definition bool.h:74
const data_expression & left(const data_expression &e)
Function for projecting out argument. left from an application.
Definition bool.h:478
Namespace for system defined sort real_.
function_symbol plus(const sort_expression &s0, const sort_expression &s1)
Definition real1.h:1056
function_symbol times(const sort_expression &s0, const sort_expression &s1)
Definition real1.h:1234
bool is_zero(const atermpp::aterm &e)
function_symbol divides(const sort_expression &s0, const sort_expression &s1)
Definition real1.h:1404
data_expression & real_one()
bool is_one(const atermpp::aterm &e)
bool is_plus_application(const atermpp::aterm &e)
Recogniser for application of +.
Definition real1.h:1133
data_expression & real_zero()
bool is_creal_application(const atermpp::aterm &e)
Recogniser for application of @cReal.
Definition real1.h:150
function_symbol minus(const sort_expression &s0, const sort_expression &s1)
Definition real1.h:1149
const basic_sort & real_()
Constructor for sort expression Real.
Definition real1.h:45
bool is_real(const sort_expression &e)
Recogniser for sort expression Real.
Definition real1.h:55
application times(const data_expression &arg0, const data_expression &arg1)
Application of function symbol *.
Definition real1.h:1282
bool is_larger_zero(const atermpp::aterm &e)
Functions that returns true if e is a closed real number larger than zero.
function_symbol abs(const sort_expression &s0)
Definition real1.h:732
bool is_times_application(const atermpp::aterm &e)
Recogniser for application of *.
Definition real1.h:1303
function_symbol negate(const sort_expression &s0)
Definition real1.h:807
bool is_negate_application(const atermpp::aterm &e)
Recogniser for application of -.
Definition real1.h:874
bool is_minus_application(const atermpp::aterm &e)
Recogniser for application of -.
Definition real1.h:1218
linear_inequality subtract(const linear_inequality &e1, const linear_inequality &e2, const data_expression &f1, const data_expression &f2, const rewriter &r)
Subtract the given equality, multiplied by f1/f2. The result is e1-(f1/f2)e2,.
data_expression optimized_imp(const data_expression &p, const data_expression &q)
Make an implication and apply optimisations.
void make_optimized_imp(data_expression &result, const data_expression &p, const data_expression &q)
Make an implication and apply optimisations.
void make_optimized_and(data_expression &result, const data_expression &p, const data_expression &q)
Make a conjunction, and optimize if possible.
void make_optimized_or(data_expression &result, const data_expression &p, const data_expression &q)
Make a disjunction.
void parse_variables(std::istream &in, OutputIterator o, VariableIterator begin, VariableIterator end, const data_specification &data_spec=detail::default_specification())
Parses and type checks a data variable declaration list checking for double occurrences of variables ...
Definition parse.h:111
application real_times(const data_expression &arg0, const data_expression &arg1)
const data::data_expression & undefined_real()
Returns a data expression of type Real that corresponds to 'undefined'.
Definition undefined.h:66
void typecheck_sort_expression(const sort_expression &sort_expr, const data_specification &data_spec)
Type check a sort expression. Throws an exception if something went wrong.
Definition typecheck.h:282
data_expression & real_one()
T rewrite(const T &x, Rewriter R)
Definition rewrite.h:103
void make_optimized_exists(data_expression &result, const variable_list &l, const data_expression &p, bool remove_variables=false)
Make an existential quantification and apply optimisations.
data_expression parse_data_expression(std::istream &in, const VariableContainer &variables, const data_specification &dataspec=detail::default_specification(), bool type_check=true, bool translate_user_notation=true, bool normalize_sorts=true)
Parses and type checks a data expression.
Definition parse.h:273
data_expression parse_data_expression(const std::string &text, const VariableContainer &variables, const data_specification &data_spec=detail::default_specification(), bool type_check=true, bool translate_user_notation=true, bool normalize_sorts=true)
Parses and type checks a data expression.
Definition parse.h:309
variable_list parse_variable_declaration_list(const std::string &text, const data_specification &dataspec=detail::default_specification())
Parses a variable declaration list.
Definition parse.h:426
bool is_closed_real_number(const data_expression &e)
bool is_application(const data_expression &t)
Returns true if the term t is an application.
application real_plus(const data_expression &arg0, const data_expression &arg1)
void parse_variables(const std::string &text, OutputIterator i, VariableIterator begin, VariableIterator end, const data_specification &data_spec=detail::default_specification())
Parses and type checks a data variable declaration list checking for double occurrences of variables ...
Definition parse.h:168
data_expression & real_minus_one()
bool is_simple_substitution(const map_substitution< AssociativeContainer > &sigma)
sort_expression parse_sort_expression(std::istream &in, const data_specification &data_spec=detail::default_specification())
Parses and type checks a sort expression.
Definition parse.h:377
data_expression optimized_or(const data_expression &p, const data_expression &q)
Make a disjunction.
bool is_positive(const data_expression &e, const rewriter &r)
bool is_where_clause(const atermpp::aterm &x)
Returns true if the term t is a where clause.
data_expression parse_data_expression(std::istream &text, const data_specification &data_spec=detail::default_specification(), bool type_check=true, bool translate_user_notation=true, bool normalize_sorts=true)
Parses and type checks a data expression.
Definition parse.h:331
application less_equal(const data_expression &arg0, const data_expression &arg1)
Application of function symbol <=.
Definition standard.h:300
data_expression optimized_not(const data_expression &arg)
Make a negation.
variable_list parse_variables(const std::string &text)
Definition parse.h:362
application real_abs(const data_expression &arg)
application less(const data_expression &arg0, const data_expression &arg1)
Application of function symbol <.
Definition standard.h:263
data::data_expression translate_user_notation(const data::data_expression &x)
Definition data.cpp:88
data_specification parse_data_specification(std::istream &in)
Parses a and type checks a data specification.
Definition parse.h:59
void typecheck_data_specification(data_specification &data_spec)
Type check a parsed mCRL2 data specification. Throws an exception if something went wrong.
Definition typecheck.h:339
std::set< data::variable > substitution_variables(const map_substitution< AssociativeContainer > &sigma)
void make_optimized_not(data_expression &result, const data_expression &arg)
Make a negation.
std::string pp_vector(const TYPE &inequalities)
Print the vector of inequalities to stderr in readable form.
bool is_abstraction(const atermpp::aterm &x)
Returns true if the term t is an abstraction.
variable parse_variable(std::istream &text, const data_specification &data_spec=detail::default_specification())
Parses and type checks a data variable declaration.
Definition parse.h:247
application if_(const data_expression &arg0, const data_expression &arg1, const data_expression &arg2)
Application of function symbol if.
Definition standard.h:224
void remove_redundant_inequalities(const std::vector< linear_inequality > &inequalities, std::vector< linear_inequality > &resulting_inequalities, const rewriter &r)
Remove every redundant inequality from a vector of inequalities.
application real_minus(const data_expression &arg0, const data_expression &arg1)
data::function_symbol parse_function_symbol(const std::string &text, const std::string &dataspec_text="")
Definition parse.h:407
map_substitution< AssociativeContainer > make_map_substitution(const AssociativeContainer &m)
Utility function for creating a map_substitution.
void fourier_motzkin(const data_expression &e_in, const variable_list &vars_in, data_expression &e_out, variable_list &vars_out, const rewriter &r)
Eliminate variables from a data expression using Gauss elimination and Fourier-Motzkin elimination.
void parse_variables(const std::string &text, OutputIterator i, const data_specification &data_spec=detail::default_specification())
Parses and type checks a data variable declaration list.
Definition parse.h:200
bool is_simple_substitution(const assignment_sequence_substitution &sigma)
std::string pp(const linear_inequality &l)
application real_divides(const data_expression &arg0, const data_expression &arg1)
std::set< variable > gauss_elimination(const std::vector< linear_inequality > &inequalities, std::vector< linear_inequality > &resulting_equalities, std::vector< linear_inequality > &resulting_inequalities, Variable_iterator variables_begin, Variable_iterator variables_end, const rewriter &r)
Try to eliminate variables from a system of inequalities using Gauss elimination.
bool is_zero(const data_expression &e)
bool is_function_symbol(const atermpp::aterm &x)
Returns true if the term t is a function symbol.
void fourier_motzkin(const std::vector< linear_inequality > &inequalities_in, Data_variable_iterator variables_begin, Data_variable_iterator variables_end, std::vector< linear_inequality > &resulting_inequalities, const rewriter &r)
data_expression rewrite_with_memory(const data_expression &t, const rewriter &r)
data_expression & real_zero()
application greater(const data_expression &arg0, const data_expression &arg1)
Application of function symbol >
Definition standard.h:337
data_expression parse_data_expression(const std::string &text, const data_specification &data_spec=detail::default_specification(), bool type_check=true, bool translate_user_notation=true, bool normalize_sorts=true)
Parses and type checks a data expression.
Definition parse.h:351
bool is_untyped_data_parameter(const atermpp::aterm &x)
void parse_variables(std::istream &text, OutputIterator i, const data_specification &data_spec=detail::default_specification())
Parses and type checks a data variable declaration list.
Definition parse.h:185
std::pair< basic_sort_vector, alias_vector > parse_sort_specification(const std::string &text)
Definition data.cpp:251
data_expression optimized_exists(const variable_list &l, const data_expression &p, bool remove_variables=false)
Make an existential quantification and apply optimisations.
sort_expression parse_sort_expression(const std::string &text, const data_specification &data_spec=detail::default_specification())
Parses and type checks a sort expression.
Definition parse.h:396
void make_optimized_forall(data_expression &result, const variable_list &l, const data_expression &p, bool remove_variables=false)
Make a universal quantification and apply optimisations.
application real_negate(const data_expression &arg)
data_expression optimized_and(const data_expression &p, const data_expression &q)
Make a conjunction, and optimize if possible.
bool is_inconsistent(const std::vector< linear_inequality > &inequalities_in, const rewriter &r, bool use_cache=true)
Determine whether a list of data expressions is inconsistent.
data_expression max(const data_expression &e1, const data_expression &e2, const rewriter &)
bool is_machine_number(const atermpp::aterm &x)
Returns true if the term t is a machine_number.
bool is_negative(const data_expression &e, const rewriter &r)
const data_expression_list & variable_list_to_data_expression_list(const variable_list &l)
Transform a variable_list into a data_expression_list.
application equal_to(const data_expression &arg0, const data_expression &arg1)
Application of function symbol ==.
Definition standard.h:149
void rewrite(T &x, Rewriter R)
Definition rewrite.h:90
data_expression min(const data_expression &e1, const data_expression &e2, const rewriter &)
data_expression optimized_forall(const variable_list &l, const data_expression &p, bool remove_variables=false)
Make a universal quantification and apply optimisations.
variable parse_variable(const std::string &text, const data_specification &data_spec=detail::default_specification())
Parses and type checks a data variable declaration.
Definition parse.h:215
data_specification parse_data_specification(const std::string &text)
Parses a and type checks a data specification.
Definition parse.h:76
void swap(data_expression &t1, data_expression &t2) noexcept
\brief swap overload
bool is_variable(const atermpp::aterm &x)
Returns true if the term t is a variable.
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
void addActionCondition(const process::action &a, const data::data_expression &c, tuple_list &&L, tuple_list &S)
void replace_global_variables(Specification &lpsspec, const data::mutable_map_substitution<> &sigma)
Applies a global variable substitution to an LPS.
stochastic_action_summand_vector convert_action_summands(const action_summand_vector &action_summands)
allow_list_cache make_allow_list_cache(const process::action_name_multiset_list &allowlist)
data::mutable_map_substitution instantiate_global_variables(Specification &lpsspec)
Eliminates the global variables of an LPS, by substituting a constant value for them....
core::identifier_string_list names(const process::action_list &multi_action)
Calculate the list of action names that appear in a multi-action.
std::vector< core::identifier_string > get_actions(const process::action_name_multiset_list &allowlist)
Summand make_action_summand(const data::variable_list &, const data::data_expression &, const multi_action &, const data::assignment_list &, const stochastic_distribution &)
The main namespace for the LPS library.
Definition constelm.h:18
lps_statistics_t get_statistics(const stochastic_action_summand_vector &action_summands, const deadlock_summand_vector &deadlock_summands)
Get statistics for action and deadlock summands.
std::set< core::identifier_string > find_identifiers(const T &x)
Returns all identifiers that occur in an object.
Definition find.h:98
std::ostream & operator<<(std::ostream &out, const stochastic_process_initializer &x)
void find_function_symbols(const T &x, OutputIterator o)
Writes all function symbols that occur in an object to an output iterator.
Definition find.h:129
process::action_list sort_actions(const process::action_list &actions)
std::ostream & operator<<(std::ostream &out, const stochastic_distribution &x)
std::string pp(const lps::stochastic_specification &x, bool arg0)
Definition lps.cpp:40
std::set< data::variable > find_all_variables(const lps::linear_process &x)
Definition lps.cpp:47
void make_stochastic_distribution(atermpp::aterm &t, const ARGUMENTS &... args)
std::string pp(const lps::specification &x, bool arg0)
Definition lps.cpp:35
std::set< data::sort_expression > find_sort_expressions(const lps::stochastic_specification &x)
Definition lps.cpp:46
std::set< data::variable > find_free_variables(const lps::stochastic_specification &x)
Definition lps.cpp:56
std::string pp(const lps::stochastic_distribution &x, bool arg0)
Definition lps.cpp:37
std::string pp_extended(const stochastic_specification &x, const std::string &process_name, bool precedence_aware, bool summand_numbers)
Definition lps.cpp:98
void complete_data_specification(stochastic_specification &spec)
Adds all sorts that appear in the process of l to the data specification of l.
void replace_variables_capture_avoiding(T &x, Substitution &sigma, data::set_identifier_generator &id_generator)
std::set< process::action_label > find_action_labels(const T &x)
Returns all action labels that occur in an object.
Definition find.h:172
std::set< data::variable > find_all_variables(const lps::multi_action &x)
Returns all variables inside a multi-action.
Definition lps.cpp:52
bool search_free_variable(const T &x, const data::variable &v)
Returns true if the term has a given free variable as subterm.
Definition find.h:151
void find_all_variables(const multi_action &x, OutputIterator o)
Returns all variables inside a multi-action.
Definition find.h:183
void swap(action_summand &t1, action_summand &t2) noexcept
\brief swap overload
void swap(deadlock_summand &t1, deadlock_summand &t2) noexcept
\brief swap overload
bool operator!=(const stochastic_specification &spec1, const stochastic_specification &spec2)
Inequality operator.
void replace_sort_expressions(T &x, const Substitution &sigma, bool innermost)
Definition replace.h:28
std::ostream & operator<<(std::ostream &out, const stochastic_linear_process &x)
std::set< data::variable > find_all_variables(const lps::stochastic_specification &x)
Definition lps.cpp:50
std::ostream & operator<<(std::ostream &out, const process_initializer &x)
bool check_well_typedness(const specification &x)
Definition lps.cpp:118
bool is_stochastic_process_initializer(const atermpp::aterm &x)
bool implies_condition(const data::data_expression &c1, const data::data_expression &c2)
void complete_data_specification(specification &spec)
Adds all sorts that appear in the process of l to the data specification of l.
std::ostream & operator<<(std::ostream &out, const specification &x)
std::set< data::variable > find_free_variables(const lps::linear_process &x)
Definition lps.cpp:53
bool is_specification(const atermpp::aterm &x)
Test for a specification expression.
bool encap(const process::action_name_multiset_list &encaplist, const process::action_list &multiaction)
Calculate if any of the actions in multiaction is blocked by encap_list.
void rewrite(T &x, Rewriter R)
Definition rewrite.h:25
bool check_well_typedness(const linear_process &x)
Definition lps.cpp:108
void swap(deadlock &t1, deadlock &t2) noexcept
\brief swap overload
Definition deadlock.h:105
void find_free_variables(const T &x, OutputIterator o)
Writes all free variables that occur in an object to an output iterator.
Definition find.h:47
void swap(multi_action &t1, multi_action &t2) noexcept
\brief swap overload
std::set< data::variable > find_all_variables(const T &x)
Returns all variables that occur in an object.
Definition find.h:36
T replace_variables_capture_avoiding(const T &x, Substitution &sigma, data::set_identifier_generator &id_generator)
std::set< data::function_symbol > find_function_symbols(const lps::stochastic_specification &x)
Definition lps.cpp:62
bool occursinterm(const data::data_expression &t, const data::variable &var)
void find_sort_expressions(const T &x, OutputIterator o)
Writes all sort expressions that occur in an object to an output iterator.
Definition find.h:109
std::string pp_extended(const specification &x, const std::string &process_name, bool precedence_aware, bool summand_numbers)
Definition lps.cpp:88
lps_statistics_t get_statistics(const stochastic_action_summand_vector &action_summands)
bool operator<(const stochastic_action_summand &x, const stochastic_action_summand &y)
Comparison operator for action summands.
mcrl2::lps::stochastic_specification linearise(const std::string &text, const mcrl2::lps::t_lin_options &lin_options=t_lin_options())
Linearises a process specification from a textual specification.
Definition linearise.h:58
std::set< data::variable > find_free_variables_with_bound(const T &x, VariableContainer const &bound)
Returns all free variables that occur in an object.
Definition find.h:78
bool encap(const Container &blocked_actions, const process::action_list &multiaction)
Calculate if any of the actions in multiaction is blocked by encap_list.
void remove_parameters(Object &x, const std::set< data::variable > &to_be_removed)
Rewrites an LPS data type.
Definition remove.h:187
atermpp::aterm specification_to_aterm(const specification_base< LinearProcess, InitialProcessExpression > &spec)
Conversion to aterm.
std::set< process::action_label > find_action_labels(const lps::process_initializer &x)
Definition lps.cpp:66
std::ostream & operator<<(std::ostream &out, const deadlock &x)
Definition deadlock.h:99
std::set< data::variable > find_free_variables(const lps::specification &x)
Definition lps.cpp:55
void constelm(Specification &spec, const DataRewriter &R, bool instantiate_global_variables=false)
Removes zero or more constant parameters from the specification spec.
Definition constelm.h:269
std::ostream & operator<<(std::ostream &out, const action_summand &x)
void normalize_sorts(lps::specification &x, const data::sort_specification &)
Definition lps.cpp:42
atermpp::aterm deadlock_summand_to_aterm(const deadlock_summand &s)
Conversion to atermappl.
std::set< data::variable > find_free_variables(const lps::deadlock &x)
Definition lps.cpp:57
bool operator==(const specification &spec1, const specification &spec2)
Equality operator.
std::string pp(const lps::deadlock_summand &x, bool arg0)
Definition lps.cpp:31
std::set< process::action_label > find_action_labels(const lps::linear_process &x)
Definition lps.cpp:65
lps::multi_action normalize_sorts(const lps::multi_action &x, const data::sort_specification &sortspec)
Definition lps.cpp:41
std::set< data::variable > find_free_variables(const lps::stochastic_linear_process &x)
Definition lps.cpp:54
std::string print(const lps_statistics_t &stats, std::size_t indent=0)
Print statistics of lps as indented block in YAML format.
std::set< data::function_symbol > find_function_symbols(const lps::specification &x)
Definition lps.cpp:61
std::string pp(const lps::stochastic_linear_process &x, bool arg0)
Definition lps.cpp:38
std::set< data::variable > find_free_variables(const lps::stochastic_process_initializer &x)
Definition lps.cpp:60
void communicationcomposition(const process::communication_expression_list &communications, const process::action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process::action &terminationAction, const bool nosumelm, const bool nodeltaelimination, const bool ignore_time, const std::function< data::data_expression(const data::data_expression &)> &RewriteTerm)
bool operator==(const stochastic_specification &spec1, const stochastic_specification &spec2)
void swap(stochastic_action_summand &t1, stochastic_action_summand &t2) noexcept
\brief swap overload
std::set< data::variable > find_free_variables(const lps::multi_action &x)
Definition lps.cpp:58
void insert_timed_delta_summand(const stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const deadlock_summand &s, const bool ignore_time)
std::string pp(const lps::deadlock &x, bool arg0)
Definition lps.cpp:30
std::ostream & operator<<(std::ostream &out, const multi_action &x)
void remove_redundant_assignments(Specification &lpsspec)
Removes redundant assignments of the form x = x from an LPS specification.
Definition remove.h:244
void allowblockcomposition(const process::action_name_multiset_list &allowlist1, const bool is_allow, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process::action &termination_action, bool ignore_time, bool nodeltaelimination)
bool operator!=(const specification &spec1, const specification &spec2)
Inequality operator.
void normalize_sorts(lps::stochastic_specification &x, const data::sort_specification &)
Definition lps.cpp:43
std::set< data::variable > find_free_variables(const lps::process_initializer &x)
Definition lps.cpp:59
data::data_expression equal_multi_actions(const multi_action &a, const multi_action &b)
Returns a data expression that expresses under which conditions the multi actions a and b are equal....
bool is_stochastic_distribution(const atermpp::aterm &x)
specification remove_stochastic_operators(const stochastic_specification &spec)
Converts a stochastic specification to a specification. Throws an exception if non-empty distribution...
bool operator==(const action_summand &x, const action_summand &y)
Equality operator of action summands.
bool is_process_initializer(const atermpp::aterm &x)
void remove_singleton_sorts(Specification &spec)
Removes parameters with a singleton sort from a linear process specification.
Definition remove.h:208
bool check_well_typedness(const Object &o)
std::string pp(const lps::stochastic_action_summand &x, bool arg0)
Definition lps.cpp:36
data::assignment_list remove_redundant_assignments(const data::assignment_list &assignments, const data::variable_list &do_not_remove)
Removes assignments of the form x := x from v for variables x that are not contained in do_not_remove...
Definition remove.h:226
T replace_sort_expressions(const T &x, const Substitution &sigma, bool innermost)
Definition replace.h:38
mcrl2::lps::stochastic_specification linearise(const mcrl2::process::process_specification &type_checked_spec, const mcrl2::lps::t_lin_options &lin_options=t_lin_options())
Linearises a process specification.
std::string pp(const lps::stochastic_process_initializer &x, bool arg0)
Definition lps.cpp:39
std::string pp(const lps::linear_process &x, bool arg0)
Definition lps.cpp:32
T rewrite(const T &x, Rewriter R)
Definition rewrite.h:38
std::set< data::sort_expression > find_sort_expressions(const T &x)
Returns all sort expressions that occur in an object.
Definition find.h:118
std::string pp(const lps::multi_action &x, bool arg0)
Definition lps.cpp:33
void make_stochastic_process_initializer(atermpp::aterm &t, ARGUMENTS... args)
void find_identifiers(const T &x, OutputIterator o)
Writes all identifiers that occur in an object to an output iterator.
Definition find.h:89
void swap(stochastic_process_initializer &t1, stochastic_process_initializer &t2) noexcept
\brief swap overload
void find_free_variables_with_bound(const T &x, OutputIterator o, const VariableContainer &bound)
Writes all free variables that occur in an object to an output iterator.
Definition find.h:57
std::set< data::variable > find_free_variables(const T &x)
Returns all free variables that occur in an object.
Definition find.h:66
std::ostream & operator<<(std::ostream &out, const stochastic_action_summand &x)
atermpp::aterm linear_process_to_aterm(const linear_process_base< ActionSummand > &p)
Conversion to aterm.
std::set< data::sort_expression > find_sort_expressions(const lps::specification &x)
Definition lps.cpp:45
void make_process_initializer(atermpp::aterm &t, EXPRESSION_LIST args)
bool operator==(const stochastic_action_summand &x, const stochastic_action_summand &y)
Equality operator of stochastic action summands.
void make_multi_action(atermpp::aterm &t, const ARGUMENTS &... args)
data::data_expression not_equal_multi_actions(const multi_action &a, const multi_action &b)
Returns a pbes expression that expresses under which conditions the multi actions a and b are not equ...
std::string log_allow_block_application(const lps_statistics_t &lps_statistics_before, const lps_statistics_t &lps_statistics_after, const bool is_allow, const std::size_t num_allowed_multiactions, const std::size_t num_blocked_actions, const bool apply_delta_elimination, const bool ignore_time, size_t indent=0)
std::string pp(const lps::action_summand &x, bool arg0)
Definition lps.cpp:29
void remove_trivial_summands(Specification &spec)
Removes summands with condition equal to false from a linear process specification.
Definition remove.h:196
bool operator<(const action_summand &x, const action_summand &y)
Comparison operator for action summands.
std::set< data::variable > find_all_variables(const lps::specification &x)
Definition lps.cpp:49
bool subsumes(const stochastic_action_summand &as, const deadlock_summand &ds)
std::ostream & operator<<(std::ostream &out, const linear_process &x)
bool check_well_typedness(const stochastic_specification &x)
Definition lps.cpp:123
std::set< data::variable > find_all_variables(const lps::deadlock &x)
Definition lps.cpp:51
atermpp::aterm action_summand_to_aterm(const action_summand &s)
Conversion to aterm.
std::set< data::variable > find_all_variables(const lps::stochastic_linear_process &x)
Definition lps.cpp:48
bool check_well_typedness(const stochastic_linear_process &x)
Definition lps.cpp:113
bool subsumes(const deadlock_summand &ds1, const deadlock_summand &ds2)
Determine if delta summand ds1 subsumes delta summand ds2.
lps::multi_action translate_user_notation(const lps::multi_action &x)
Definition lps.cpp:44
void swap(stochastic_distribution &t1, stochastic_distribution &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const stochastic_specification &x)
void find_all_variables(const T &x, OutputIterator o)
Writes all variables that occur in an object to an output iterator.
Definition find.h:27
std::set< core::identifier_string > find_identifiers(const lps::stochastic_specification &x)
Definition lps.cpp:64
std::set< data::function_symbol > find_function_symbols(const T &x)
Returns all function symbols that occur in an object.
Definition find.h:138
void find_action_labels(const T &x, OutputIterator o)
Returns all action labels that occur in an object.
Definition find.h:163
atermpp::aterm action_summand_to_aterm(const stochastic_action_summand &s)
Conversion to aterm.
void swap(process_initializer &t1, process_initializer &t2) noexcept
\brief swap overload
std::set< core::identifier_string > find_identifiers(const lps::specification &x)
Definition lps.cpp:63
std::ostream & operator<<(std::ostream &out, const deadlock_summand &x)
bool allow_(const detail::allow_list_cache &allow_cache, const process::action_list &multi_action, const process::action &termination_action)
Determine if multi_action is allowed by an allow expression in allow_list.
std::set< process::action_label > find_action_labels(const lps::specification &x)
Definition lps.cpp:67
std::string pp(const lps::process_initializer &x, bool arg0)
Definition lps.cpp:34
bool is_multi_action(const atermpp::aterm &x)
bool is_linear_process(const atermpp::aterm &x)
Test for a linear_process expression.
void complete_process_specification(process_specification &x, bool alpha_reduce)
Definition process.cpp:150
std::pair< data::data_expression_list, data::sort_expression_list > match_action_parameters(const data::data_expression_list &parameters, const std::set< data::sort_expression_list > &possible_parameter_sorts, const data::detail::variable_context &variable_context, const core::identifier_string &name, const std::string &msg, data::data_type_checker &typechecker)
process_specification parse_process_specification_new(const std::string &text)
Definition process.cpp:137
bool multi_actions_contains(const core::identifier_string_list &a, const action_name_multiset_list &A)
Definition typecheck.h:75
typecheck_builder make_typecheck_builder(data::data_type_checker &data_typechecker, const data::detail::variable_context &variables, const detail::process_context &process_identifiers, const detail::action_context &action_context, const process_identifier *current_equation=nullptr)
Definition typecheck.h:621
bool equal_multi_actions(core::identifier_string_list a1, core::identifier_string_list a2)
Definition typecheck.h:89
std::tuple< bool, data::data_expression_vector, std::string > match_action_parameters(const data::data_expression_list &parameters, const data::sort_expression_list &expected_sorts, const data::detail::variable_context &variable_context, data::data_type_checker &typechecker)
process_expression parse_process_expression_new(const std::string &text)
Definition process.cpp:125
The main namespace for the Process library.
std::string pp(const action_list &x, bool precedence_aware=true)
Definition process.cpp:24
bool is_at(const atermpp::aterm &x)
std::set< core::identifier_string > find_identifiers(const process::process_specification &x)
Definition process.cpp:79
void find_identifiers(const T &x, OutputIterator o)
Writes all identifiers that occur in an object to an output iterator.
Definition find.h:201
void swap(rename &t1, rename &t2) noexcept
\brief swap overload
void make_allow(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(at &t1, at &t2) noexcept
\brief swap overload
void swap(action &t1, action &t2) noexcept
\brief swap overload
void complete_data_specification(process_specification &)
Adds all sorts that appear in the process specification spec to the data specification of spec.
void swap(untyped_multi_action &t1, untyped_multi_action &t2) noexcept
\brief swap overload
bool operator<(const action_label &a1, const action_label &a2)
Total ordering on action labels: name first (string order), then sorts.
std::set< data::variable > find_all_variables(const action &x)
Definition process.cpp:76
std::ostream & operator<<(std::ostream &out, const sync &x)
void normalize_sorts(process::process_equation_vector &x, const data::sort_specification &sortspec)
Definition process.cpp:67
std::ostream & operator<<(std::ostream &out, const bounded_init &x)
void make_choice(atermpp::aterm &t, const ARGUMENTS &... args)
T replace_sort_expressions(const T &x, const Substitution &sigma, bool innermost)
Definition replace.h:33
std::ostream & operator<<(std::ostream &out, const process_specification &x)
std::string pp(const process::action_name_multiset &x, bool arg0)
Definition process.cpp:36
std::string pp(const process_equation_list &x)
std::string pp(const process::action_label &x, bool arg0)
Definition process.cpp:35
std::string pp(const process::process_equation &x, bool arg0)
Definition process.cpp:50
void find_action_labels(const T &x, OutputIterator o)
Writes all action labels that occur in an object to an output iterator.
Definition find.h:262
std::string pp(const process::process_identifier &x, bool arg0)
Definition process.cpp:52
void swap(if_then &t1, if_then &t2) noexcept
\brief swap overload
void make_process_identifier(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(bounded_init &t1, bounded_init &t2) noexcept
\brief swap overload
std::set< data::sort_expression > find_sort_expressions(const process::process_specification &x)
Definition process.cpp:75
bool is_process_instance(const atermpp::aterm &x)
void swap(delta &t1, delta &t2) noexcept
\brief swap overload
std::set< data::sort_expression_list > sorts_list_difference(const std::set< data::sort_expression_list > &sorts1, const std::set< data::sort_expression_list > &sorts2)
Definition typecheck.h:41
std::string pp(const tau &x, bool precedence_aware=true)
Definition process.cpp:62
process::action_label_list normalize_sorts(const process::action_label_list &x, const data::sort_specification &sortspec)
Definition process.cpp:66
std::ostream & operator<<(std::ostream &out, const sum &x)
std::string pp(const if_then &x, bool precedence_aware=true)
Definition process.cpp:46
std::set< data::sort_expression > find_sort_expressions(const process::process_equation_vector &x)
Definition process.cpp:73
void make_merge(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(rename_expression &t1, rename_expression &t2) noexcept
\brief swap overload
std::string pp(const stochastic_operator &x, bool precedence_aware=true)
Definition process.cpp:59
void swap(merge &t1, merge &t2) noexcept
\brief swap overload
void make_at(atermpp::aterm &t, const ARGUMENTS &... args)
process_expression typecheck_process_expression(const process_expression &x, const VariableContainer &variables=VariableContainer(), const data::data_specification &dataspec=data::data_specification(), const ActionLabelContainer &action_labels=ActionLabelContainer(), const ProcessIdentifierContainer &process_identifiers=ProcessIdentifierContainer(), const process_identifier *current_equation=nullptr)
Typecheck a process expression.
Definition typecheck.h:748
void normalize_sorts(process::process_specification &x, const data::sort_specification &)
Definition process.cpp:68
process::action_label_list parse_action_declaration(const std::string &text, const data::data_specification &data_spec)
Parses an action declaration from a string.
Definition process.cpp:110
process_expression parse_process_expression(const std::string &text, const VariableContainer &variables=VariableContainer(), const data::data_specification &dataspec=data::data_specification(), const ActionLabelContainer &action_labels=std::vector< action_label >(), const ProcessIdentifierContainer &process_identifiers=ProcessIdentifierContainer(), const process_identifier *current_equation=nullptr)
Definition parse.h:129
bool is_process_expression(const atermpp::aterm &x)
bool is_process_instance_assignment(const atermpp::aterm &x)
void swap(left_merge &t1, left_merge &t2) noexcept
\brief swap overload
std::string pp(const process::communication_expression &x, bool arg0)
Definition process.cpp:43
std::ostream & operator<<(std::ostream &out, const untyped_process_assignment &x)
std::ostream & operator<<(std::ostream &out, const process_equation &x)
bool is_tau(const atermpp::aterm &x)
std::string pp(const process::rename_expression &x, bool arg0)
Definition process.cpp:57
std::ostream & operator<<(std::ostream &out, const stochastic_operator &x)
std::set< data::variable > find_free_variables(const T &x)
Returns all free variables that occur in an object.
Definition find.h:178
std::ostream & operator<<(std::ostream &out, const left_merge &x)
std::string pp(const process_identifier_list &x)
void make_action(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const process_identifier &x)
bool is_seq(const atermpp::aterm &x)
void make_sync(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(allow &t1, allow &t2) noexcept
\brief swap overload
std::set< data::sort_expression > find_sort_expressions(const T &x)
Returns all sort expressions that occur in an object.
Definition find.h:230
bool is_merge(const atermpp::aterm &x)
std::set< data::sort_expression > find_sort_expressions(const process::action_label_list &x)
Definition process.cpp:72
void make_if_then_else(atermpp::aterm &t, const ARGUMENTS &... args)
bool is_action_label(const atermpp::aterm &x)
void swap(process_identifier &t1, process_identifier &t2) noexcept
\brief swap overload
void make_hide(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(hide &t1, hide &t2) noexcept
\brief swap overload
bool is_communication_expression(const atermpp::aterm &x)
std::set< core::identifier_string > find_action_names(const T &x)
Returns all action names that occur in an object.
Definition find.h:282
std::ostream & operator<<(std::ostream &out, const communication_expression &x)
bool is_allow(const atermpp::aterm &x)
std::string pp(const process_expression &x, bool precedence_aware=true)
Definition process.cpp:51
std::string pp(const merge &x, bool precedence_aware=true)
Definition process.cpp:49
bool is_process_specification(const atermpp::aterm &x)
Test for a process specification expression.
std::string pp(const rename &x, bool precedence_aware=true)
Definition process.cpp:56
void swap(action_label &t1, action_label &t2) noexcept
\brief swap overload
bool operator<(const action &a1, const action &a2)
std::string pp(const seq &x, bool precedence_aware=true)
Definition process.cpp:58
void make_if_then(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const choice &x)
void swap(seq &t1, seq &t2) noexcept
\brief swap overload
std::string pp(const sum &x, bool precedence_aware=true)
Definition process.cpp:60
std::set< process::action_label > find_action_labels(const T &x)
Returns all action labels that occur in an object.
Definition find.h:271
std::string pp(const process::process_specification &x, bool arg0)
Definition process.cpp:55
bool is_bounded_init(const atermpp::aterm &x)
bool is_delta(const atermpp::aterm &x)
std::ostream & operator<<(std::ostream &out, const rename &x)
void typecheck_process_specification(process_specification &proc_spec)
Type check a parsed mCRL2 process specification. Throws an exception if something went wrong.
Definition typecheck.h:733
std::string pp(const process_expression_list &x, bool precedence_aware=true)
Definition process.cpp:30
void find_sort_expressions(const T &x, OutputIterator o)
Writes all sort expressions that occur in an object to an output iterator.
Definition find.h:221
std::string pp(const bounded_init &x, bool precedence_aware=true)
Definition process.cpp:40
void swap(untyped_process_assignment &t1, untyped_process_assignment &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const process_instance_assignment &x)
std::ostream & operator<<(std::ostream &out, const process_instance &x)
std::set< data::sort_expression > find_sort_expressions(const process::process_expression &x)
Definition process.cpp:74
std::ostream & operator<<(std::ostream &out, const untyped_multi_action &x)
void make_block(atermpp::aterm &t, const ARGUMENTS &... args)
process::process_expression translate_user_notation(const process::process_expression &x)
Definition process.cpp:70
bool is_sum(const atermpp::aterm &x)
process_specification parse_process_specification(const std::string &spec_string)
Parses a process specification from a string.
Definition parse.h:55
std::string pp(const allow &x, bool precedence_aware=true)
Definition process.cpp:37
std::string pp(const multi_action_name_set &A)
Pretty print function for a set of multi action names.
bool is_process_identifier(const atermpp::aterm &x)
std::ostream & operator<<(std::ostream &out, const at &x)
void swap(block &t1, block &t2) noexcept
\brief swap overload
bool is_block(const atermpp::aterm &x)
void translate_user_notation(process::process_specification &x)
Definition process.cpp:71
bool is_if_then_else(const atermpp::aterm &x)
void make_action_label(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const allow &x)
bool is_comm(const atermpp::aterm &x)
void find_function_symbols(const T &x, OutputIterator o)
Writes all function symbols that occur in an object to an output iterator.
Definition find.h:241
action normalize_sorts(const action &x, const data::sort_specification &sortspec)
Definition process.cpp:65
atermpp::aterm process_specification_to_aterm(const process_specification &spec)
Conversion to aterm.
std::set< data::variable > find_all_variables(const T &x)
Returns all variables that occur in an object.
Definition find.h:148
void alphabet_reduce(process_specification &procspec, std::size_t duplicate_equation_limit=(std::numeric_limits< size_t >::max)())
Applies alphabet reduction to a process specification.
Definition process.cpp:82
std::string pp(const process_instance &x, bool precedence_aware=true)
Definition process.cpp:53
std::ostream & operator<<(std::ostream &out, const if_then_else &x)
bool is_action(const atermpp::aterm &x)
std::string pp(const left_merge &x, bool precedence_aware=true)
Definition process.cpp:48
process_expression parse_process_expression(const std::string &text, const VariableContainer &variables, const process_specification &procspec)
Parses and type checks a process expression. N.B. Very inefficient!
Definition parse.h:116
void swap(stochastic_operator &t1, stochastic_operator &t2) noexcept
\brief swap overload
std::set< core::identifier_string > find_identifiers(const T &x)
Returns all identifiers that occur in an object.
Definition find.h:210
void swap(if_then_else &t1, if_then_else &t2) noexcept
\brief swap overload
bool is_left_merge(const atermpp::aterm &x)
std::string pp(const sync &x, bool precedence_aware=true)
Definition process.cpp:61
std::string pp(const action &x, bool precedence_aware=true)
Definition process.cpp:34
action typecheck_action(const core::identifier_string &name, const data::data_expression_list &parameters, data::data_type_checker &typechecker, const data::detail::variable_context &variable_context, const detail::action_context &action_context)
Definition typecheck.h:25
std::ostream & operator<<(std::ostream &out, const tau &x)
std::string pp(const process::untyped_multi_action &x, bool arg0)
Definition process.cpp:63
void swap(process_instance &t1, process_instance &t2) noexcept
\brief swap overload
void make_communication_expression(atermpp::aterm &t, const ARGUMENTS &... args)
void replace_sort_expressions(T &x, const Substitution &sigma, bool innermost)
Definition replace.h:23
std::string pp(const at &x, bool precedence_aware=true)
Definition process.cpp:38
void make_stochastic_operator(atermpp::aterm &t, const ARGUMENTS &... args)
bool is_action_name_multiset(const atermpp::aterm &x)
process_expression parse_process_expression(const std::string &text, const std::string &data_decl, const std::string &proc_decl)
Parses and type checks a process expression.
Definition parse.h:88
void swap(communication_expression &t1, communication_expression &t2) noexcept
\brief swap overload
std::string pp(const comm &x, bool precedence_aware=true)
Definition process.cpp:42
void swap(process_expression &t1, process_expression &t2) noexcept
\brief swap overload
std::set< data::function_symbol > find_function_symbols(const T &x)
Returns all function symbols that occur in an object.
Definition find.h:250
bool is_untyped_multi_action(const atermpp::aterm &x)
void replace_variables_capture_avoiding(T &x, Substitution &sigma, data::set_identifier_generator &id_generator)
void make_process_instance(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const hide &x)
bool is_hide(const atermpp::aterm &x)
std::string pp(const untyped_process_assignment &x, bool precedence_aware=true)
Definition process.cpp:64
void swap(tau &t1, tau &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const delta &x)
bool is_if_then(const atermpp::aterm &x)
void find_free_variables(const T &x, OutputIterator o)
Writes all free variables that occur in an object to an output iterator.
Definition find.h:159
std::ostream & operator<<(std::ostream &out, const comm &x)
void find_all_variables(const T &x, OutputIterator o)
Writes all variables that occur in an object to an output iterator.
Definition find.h:139
void make_untyped_process_assignment(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const action_name_multiset &x)
void make_process_instance_assignment(atermpp::aterm &t, const ARGUMENTS &... args)
bool is_choice(const atermpp::aterm &x)
action translate_user_notation(const action &x)
Definition process.cpp:69
std::set< data::variable > find_free_variables(const action &x)
Definition process.cpp:77
std::string pp(const process_instance_assignment &x, bool precedence_aware=true)
Definition process.cpp:54
bool operator==(const process_specification &spec1, const process_specification &spec2)
Equality operator.
std::string pp(const process_expression_vector &x, bool precedence_aware=true)
Definition process.cpp:31
void make_comm(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const seq &x)
process_identifier parse_process_identifier(std::string text, const data::data_specification &dataspec)
Parses a process identifier.
Definition parse.h:63
bool is_stochastic_operator(const atermpp::aterm &x)
bool is_process_equation(const atermpp::aterm &x)
std::ostream & operator<<(std::ostream &out, const rename_expression &x)
T replace_variables_capture_avoiding(const T &x, Substitution &sigma, data::set_identifier_generator &id_generator)
std::set< data::variable > find_free_variables_with_bound(const T &x, VariableContainer const &bound)
Returns all free variables that occur in an object.
Definition find.h:190
std::string pp(const block &x, bool precedence_aware=true)
Definition process.cpp:39
void find_free_variables_with_bound(const T &x, OutputIterator o, const VariableContainer &bound)
Writes all free variables that occur in an object to an output iterator.
Definition find.h:169
void make_untyped_multi_action(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(sum &t1, sum &t2) noexcept
\brief swap overload
void make_bounded_init(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const process_expression &x)
void swap(process_instance_assignment &t1, process_instance_assignment &t2) noexcept
\brief swap overload
bool is_rename_expression(const atermpp::aterm &x)
void swap(comm &t1, comm &t2) noexcept
\brief swap overload
std::set< data::variable > find_free_variables(const process::process_specification &x)
Definition process.cpp:78
void make_rename_expression(atermpp::aterm &t, const ARGUMENTS &... args)
const process_equation & find_equation(const std::vector< process_equation > &equations, const process_identifier &id)
Finds an equation that corresponds to a process identifier.
Definition find.h:294
void make_process_equation(atermpp::aterm &t, const ARGUMENTS &... args)
void make_action_name_multiset(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const action_label &x)
std::ostream & operator<<(std::ostream &out, const block &x)
bool operator!=(const process_specification &spec1, const process_specification &spec2)
Inequality operator.
std::ostream & operator<<(std::ostream &out, const action &x)
std::ostream & operator<<(std::ostream &out, const merge &x)
void swap(choice &t1, choice &t2) noexcept
\brief swap overload
std::string pp(const choice &x, bool precedence_aware=true)
Definition process.cpp:41
bool is_rename(const atermpp::aterm &x)
process_expression parse_process_expression(const std::string &text, const std::string &procspec_text)
Parses and type checks a process expression.
Definition parse.h:104
bool is_untyped_process_assignment(const atermpp::aterm &x)
void make_rename(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(process_equation &t1, process_equation &t2) noexcept
\brief swap overload
void make_seq(atermpp::aterm &t, const ARGUMENTS &... args)
bool is_sync(const atermpp::aterm &x)
std::string pp(const delta &x, bool precedence_aware=true)
Definition process.cpp:44
void make_sum(atermpp::aterm &t, const ARGUMENTS &... args)
std::string pp(const hide &x, bool precedence_aware=true)
Definition process.cpp:45
std::string pp(const if_then_else &x, bool precedence_aware=true)
Definition process.cpp:47
process_specification parse_process_specification(std::istream &in)
Parses a process specification from an input stream.
Definition parse.h:42
void swap(action_name_multiset &t1, action_name_multiset &t2) noexcept
\brief swap overload
bool equal_signatures(const action &a, const action &b)
Compares the signatures of two actions.
void swap(sync &t1, sync &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const if_then &x)
std::string pp(const process::action_label_list &x, bool arg0)
Definition process.cpp:26
void make_left_merge(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(atermpp::aterm &t1, atermpp::aterm &t2) noexcept
Swaps two term_applss.
Definition aterm.h:364
expression builder that visits all sub expressions
Definition builder.h:32
static const atermpp::aterm Delta
static const atermpp::aterm UntypedProcessAssignment
static const atermpp::aterm Distribution
static const atermpp::aterm Allow
static const atermpp::aterm RenameExpr
static const atermpp::aterm Tau
static const atermpp::aterm ActId
static const atermpp::aterm Hide
static const atermpp::aterm LinearProcessInit
static const atermpp::aterm Rename
static const atermpp::aterm Process
static const atermpp::aterm IfThen
static const atermpp::aterm StochasticOperator
static const atermpp::aterm BInit
static const atermpp::aterm Merge
static const atermpp::aterm Action
static const atermpp::aterm MultActName
static const atermpp::aterm AtTime
static const atermpp::aterm Choice
static const atermpp::aterm Comm
static const atermpp::aterm ProcessAssignment
static const atermpp::aterm Sync
static const atermpp::aterm LMerge
static const atermpp::aterm ProcVarId
static const atermpp::aterm ProcExpr
static const atermpp::aterm Seq
static const atermpp::aterm Sum
static const atermpp::aterm UntypedMultiAction
static const atermpp::aterm Block
static const atermpp::aterm ProcEqn
static const atermpp::aterm CommExpr
static const atermpp::aterm IfThenElse
expression traverser that visits all sub expressions
Definition traverser.h:29
Substitution that maps data variables to data expressions. The substitution is stored as an assignmen...
assignment_sequence_substitution(const assignment_list &assignments_)
const data_expression & operator()(const variable &v) const
void apply(T &result, const data_expression &x)
Definition rewrite.h:39
rewrite_data_expressions_with_substitution_builder(Rewriter R_, Substitution sigma_)
Definition rewrite.h:64
A unary function that can be used in combination with replace_data_expressions to eliminate real numb...
fourier_motzkin_sigma(const rewriter &rewr_)
data_expression apply(const abstraction &d, bool negate) const
data_expression operator()(const data_expression &d) const
static constexpr bool is_identity_substitution
Generic substitution function. The substitution is stored as a mapping of variables to expressions.
const AssociativeContainer & m_map
map_substitution(const AssociativeContainer &m)
static constexpr bool is_identity_substitution
expression_type operator()(const variable_type &v) const
\brief Traverser class
Definition traverser.h:596
void update(lps::action_summand &x)
Definition builder.h:222
void apply(T &result, const lps::stochastic_process_initializer &x)
Definition builder.h:308
void update(lps::linear_process &x)
Definition builder.h:245
void apply(T &result, const lps::multi_action &x)
Definition builder.h:205
void apply(T &result, const lps::stochastic_distribution &x)
Definition builder.h:264
void update(lps::specification &x)
Definition builder.h:253
void update(lps::deadlock &x)
Definition builder.h:195
void update(lps::stochastic_linear_process &x)
Definition builder.h:289
void apply(T &result, const lps::process_initializer &x)
Definition builder.h:238
void update(lps::stochastic_action_summand &x)
Definition builder.h:271
void update(lps::deadlock_summand &x)
Definition builder.h:212
void update(lps::stochastic_specification &x)
Definition builder.h:297
Maintains a multiset of bound data variables during traversal.
Definition add_binding.h:23
void enter(const stochastic_specification &x)
Definition add_binding.h:93
void leave(const stochastic_process_initializer &x)
void enter(const action_summand &x)
Definition add_binding.h:31
void leave(const stochastic_specification &x)
Definition add_binding.h:98
void leave(const deadlock_summand &x)
Definition add_binding.h:58
void leave(const linear_process &x)
Definition add_binding.h:68
void enter(const stochastic_linear_process &x)
Definition add_binding.h:73
void leave(const action_summand &x)
Definition add_binding.h:36
void leave(const stochastic_linear_process &x)
Definition add_binding.h:78
void enter(const specification &x)
Definition add_binding.h:83
void enter(const deadlock_summand &x)
Definition add_binding.h:53
void enter(const stochastic_action_summand &x)
Definition add_binding.h:41
void leave(const specification &x)
Definition add_binding.h:88
void enter(const linear_process &x)
Definition add_binding.h:63
void enter(const stochastic_process_initializer &x)
void leave(const stochastic_action_summand &x)
Definition add_binding.h:47
void apply(T &result, data::where_clause &x)
void apply(const data::where_clause &x)
void update(lps::deadlock &x)
Definition builder.h:32
void update(lps::stochastic_specification &x)
Definition builder.h:153
void update(lps::specification &x)
Definition builder.h:99
void apply(T &result, const lps::process_initializer &x)
Definition builder.h:81
void apply(T &result, const lps::stochastic_process_initializer &x)
Definition builder.h:168
void update(lps::action_summand &x)
Definition builder.h:62
void apply(T &result, const lps::stochastic_distribution &x)
Definition builder.h:114
void update(lps::stochastic_linear_process &x)
Definition builder.h:142
void update(lps::stochastic_action_summand &x)
Definition builder.h:121
void apply(T &result, const lps::multi_action &x)
Definition builder.h:42
void update(lps::linear_process &x)
Definition builder.h:88
void update(lps::deadlock_summand &x)
Definition builder.h:49
void apply(const lps::action_summand &x)
Definition traverser.h:547
void apply(const lps::multi_action &x)
Definition traverser.h:540
void apply(const lps::specification &x)
Definition traverser.h:561
void apply(const lps::stochastic_action_summand &x)
Definition traverser.h:569
void apply(const lps::stochastic_linear_process &x)
Definition traverser.h:576
void apply(const lps::stochastic_specification &x)
Definition traverser.h:583
void apply(const lps::linear_process &x)
Definition traverser.h:554
void apply(const lps::stochastic_linear_process &x)
Definition traverser.h:240
void apply(const lps::multi_action &x)
Definition traverser.h:172
void apply(const lps::deadlock &x)
Definition traverser.h:162
void apply(const lps::stochastic_specification &x)
Definition traverser.h:248
void apply(const lps::specification &x)
Definition traverser.h:215
void apply(const lps::deadlock_summand &x)
Definition traverser.h:183
void apply(const lps::action_summand &x)
Definition traverser.h:191
void apply(const lps::stochastic_action_summand &x)
Definition traverser.h:230
void apply(const lps::stochastic_distribution &x)
Definition traverser.h:223
void apply(const lps::linear_process &x)
Definition traverser.h:207
void apply(const lps::stochastic_process_initializer &x)
Definition traverser.h:256
void apply(const lps::process_initializer &x)
Definition traverser.h:200
void apply(const lps::stochastic_linear_process &x)
Definition traverser.h:495
void apply(const lps::stochastic_action_summand &x)
Definition traverser.h:484
void apply(const lps::action_summand &x)
Definition traverser.h:440
void apply(const lps::specification &x)
Definition traverser.h:466
void apply(const lps::process_initializer &x)
Definition traverser.h:450
void apply(const lps::stochastic_distribution &x)
Definition traverser.h:476
void apply(const lps::linear_process &x)
Definition traverser.h:457
void apply(const lps::deadlock_summand &x)
Definition traverser.h:431
void apply(const lps::stochastic_process_initializer &x)
Definition traverser.h:514
void apply(const lps::stochastic_specification &x)
Definition traverser.h:504
void apply(const lps::multi_action &x)
Definition traverser.h:420
void apply(const lps::deadlock &x)
Definition traverser.h:410
void apply(const lps::stochastic_action_summand &x)
Definition traverser.h:106
void apply(const lps::stochastic_linear_process &x)
Definition traverser.h:117
void apply(const lps::stochastic_specification &x)
Definition traverser.h:126
void apply(const lps::stochastic_process_initializer &x)
Definition traverser.h:136
void apply(const lps::stochastic_distribution &x)
Definition traverser.h:98
void apply(const lps::multi_action &x)
Definition traverser.h:42
void apply(const lps::process_initializer &x)
Definition traverser.h:72
void apply(const lps::action_summand &x)
Definition traverser.h:62
void apply(const lps::specification &x)
Definition traverser.h:88
void apply(const lps::deadlock_summand &x)
Definition traverser.h:53
void apply(const lps::deadlock &x)
Definition traverser.h:32
void apply(const lps::linear_process &x)
Definition traverser.h:79
void apply(const lps::linear_process &x)
Definition traverser.h:329
void apply(const lps::specification &x)
Definition traverser.h:338
void apply(const lps::stochastic_process_initializer &x)
Definition traverser.h:384
void apply(const lps::deadlock &x)
Definition traverser.h:282
void apply(const lps::stochastic_linear_process &x)
Definition traverser.h:366
void apply(const lps::multi_action &x)
Definition traverser.h:292
void apply(const lps::action_summand &x)
Definition traverser.h:312
void apply(const lps::stochastic_action_summand &x)
Definition traverser.h:355
void apply(const lps::deadlock_summand &x)
Definition traverser.h:303
void apply(const lps::stochastic_distribution &x)
Definition traverser.h:347
void apply(const lps::stochastic_specification &x)
Definition traverser.h:375
void apply(const lps::process_initializer &x)
Definition traverser.h:322
void update(lps::action_summand &x)
Definition builder.h:364
void update(lps::deadlock &x)
Definition builder.h:334
void apply(T &result, const lps::multi_action &x)
Definition builder.h:344
void apply(T &result, const lps::stochastic_process_initializer &x)
Definition builder.h:464
void update(lps::specification &x)
Definition builder.h:401
void apply(T &result, const lps::stochastic_distribution &x)
Definition builder.h:413
void update(lps::linear_process &x)
Definition builder.h:390
void update(lps::stochastic_action_summand &x)
Definition builder.h:420
void update(lps::stochastic_specification &x)
Definition builder.h:452
void apply(T &result, const lps::process_initializer &x)
Definition builder.h:383
void update(lps::stochastic_linear_process &x)
Definition builder.h:441
void update(lps::deadlock_summand &x)
Definition builder.h:351
void apply(T &result, const stochastic_distribution &x, data::data_expression_list &pars)
In the code below, it is essential that the assignments are also updated. They are passed by referenc...
void apply(T &result, const stochastic_distribution &x, data::assignment_list &assignments)
In the code below, it is essential that the assignments are also updated. They are passed by referenc...
void do_action_summand(ActionSummand &x, const data::variable_list &v)
add_capture_avoiding_replacement(data::detail::capture_avoiding_substitution_updater< Substitution > &sigma)
Function object that checks if a sort is a singleton sort. Note that it is an approximation,...
Definition remove.h:36
is_singleton_sort(const data::data_specification &data_spec)
Definition remove.h:39
bool operator()(const data::sort_expression &s) const
Definition remove.h:43
const data::data_specification & m_data_spec
Definition remove.h:37
Function object that checks if a summand has a false condition.
Definition remove.h:25
bool operator()(const summand_base &s) const
Definition remove.h:26
Traverser for removing parameters from LPS data types. These parameters can be either process paramet...
Definition remove.h:58
void apply(atermpp::term_list< T > &result, const data::assignment_list &x)
Removes parameters from a list of assignments. Assignments to removed parameters are removed.
Definition remove.h:101
void apply(T &result, const stochastic_process_initializer &x)
Definition remove.h:156
void apply(T &result, const process_initializer &x)
Definition remove.h:149
void update(std::set< data::variable > &x)
Removes parameters from a set container.
Definition remove.h:73
const std::set< data::variable > & to_be_removed
Definition remove.h:65
void apply(atermpp::term_list< T > &result, const data::variable_list &x)
Removes parameters from a list of variables.
Definition remove.h:83
void update(linear_process &x)
Removes parameters from a linear_process.
Definition remove.h:111
data::data_expression_list remove_expressions(const data::data_expression_list &e)
Removes expressions from e at the corresponding positions of process_parameters.
Definition remove.h:130
void update(stochastic_specification &x)
Removes parameters from a linear process specification.
Definition remove.h:175
void update(specification &x)
Removes parameters from a linear process specification.
Definition remove.h:166
remove_parameters_builder(const std::set< data::variable > &to_be_removed_)
Definition remove.h:68
void update(stochastic_linear_process &x)
Removes parameters from a linear_process.
Definition remove.h:121
std::vector< process::action_list > actions
std::vector< data::data_expression > conditions
tuple_list(std::vector< process::action_list > &&actions_, std::vector< data::data_expression > &&conditions_)
tuple_list(const std::vector< process::action_list > &actions_, const std::vector< data::data_expression > &conditions_)
Data structure to store the statistics about summands in a linear process.
std::optional< size_t > deadlock_summand_count
Options for linearisation.
Definition linearise.h:25
t_lin_method lin_method
Definition linearise.h:26
mcrl2::data::rewriter::strategy rewrite_strategy
Definition linearise.h:41
\brief Builder class
Definition builder.h:476
\brief Traverser class
Definition traverser.h:397
bool operator()(const core::identifier_string &s1, const core::identifier_string &s2) const
void apply(T &result, const process::process_equation &x)
Definition builder.h:405
void apply(T &result, const process::rename &x)
Definition builder.h:487
void apply(T &result, const process::left_merge &x)
Definition builder.h:567
void apply(T &result, const process::bounded_init &x)
Definition builder.h:551
void apply(T &result, const process::process_expression &x)
Definition builder.h:599
void apply(T &result, const process::block &x)
Definition builder.h:471
void apply(T &result, const process::merge &x)
Definition builder.h:559
void apply(T &result, const process::sync &x)
Definition builder.h:511
void apply(T &result, const process::choice &x)
Definition builder.h:575
void apply(T &result, const process::if_then &x)
Definition builder.h:535
void apply(T &result, const process::action &x)
Definition builder.h:421
void apply(T &result, const process::delta &x)
Definition builder.h:445
void apply(T &result, const process::process_instance_assignment &x)
Definition builder.h:437
void apply(T &result, const process::untyped_process_assignment &x)
Definition builder.h:591
void apply(T &result, const process::stochastic_operator &x)
Definition builder.h:583
void update(process::process_specification &x)
Definition builder.h:394
void apply(T &result, const process::allow &x)
Definition builder.h:503
void apply(T &result, const process::at &x)
Definition builder.h:519
void apply(T &result, const process::sum &x)
Definition builder.h:463
void apply(T &result, const process::seq &x)
Definition builder.h:527
void apply(T &result, const process::tau &x)
Definition builder.h:454
void apply(T &result, const process::comm &x)
Definition builder.h:495
void apply(T &result, const process::untyped_multi_action &x)
Definition builder.h:413
void apply(T &result, const process::hide &x)
Definition builder.h:479
void apply(T &result, const process::if_then_else &x)
Definition builder.h:543
void apply(T &result, const process::process_instance &x)
Definition builder.h:429
Maintains a multiset of bound data variables during traversal.
Definition add_binding.h:24
void enter(const process::stochastic_operator &x)
Definition add_binding.h:43
void leave(const process::stochastic_operator &x)
Definition add_binding.h:48
void enter(const process::sum &x)
Definition add_binding.h:33
void leave(const process::sum &x)
Definition add_binding.h:38
void apply(const process::process_instance_assignment &x)
Definition add_binding.h:59
void apply(T &result, const data::where_clause &x)
void apply(const data::where_clause &x)
Definition add_binding.h:91
void apply(T &result, const process::sync &x)
Definition builder.h:1160
void apply(T &result, const process::rename &x)
Definition builder.h:1136
void apply(T &result, const process::if_then_else &x)
Definition builder.h:1192
void apply(T &result, const process::process_equation &x)
Definition builder.h:1059
void apply(T &result, const process::bounded_init &x)
Definition builder.h:1200
void apply(T &result, const process::at &x)
Definition builder.h:1168
void apply(T &result, const process::if_then &x)
Definition builder.h:1184
void apply(T &result, const process::choice &x)
Definition builder.h:1224
void apply(T &result, const process::tau &x)
Definition builder.h:1103
void apply(T &result, const process::merge &x)
Definition builder.h:1208
void apply(T &result, const process::left_merge &x)
Definition builder.h:1216
void apply(T &result, const process::sum &x)
Definition builder.h:1112
void apply(T &result, const process::seq &x)
Definition builder.h:1176
void apply(T &result, const process::untyped_process_assignment &x)
Definition builder.h:1240
void apply(T &result, const process::block &x)
Definition builder.h:1120
void apply(T &result, const process::allow &x)
Definition builder.h:1152
void apply(T &result, const process::action &x)
Definition builder.h:1067
void apply(T &result, const process::hide &x)
Definition builder.h:1128
void apply(T &result, const process::process_expression &x)
Definition builder.h:1249
void apply(T &result, const process::process_instance_assignment &x)
Definition builder.h:1085
void apply(T &result, const process::comm &x)
Definition builder.h:1144
void apply(T &result, const process::delta &x)
Definition builder.h:1094
void apply(T &result, const process::process_instance &x)
Definition builder.h:1076
void update(process::process_specification &x)
Definition builder.h:1048
void apply(T &result, const process::stochastic_operator &x)
Definition builder.h:1232
void apply(T &result, const process::process_expression &x)
Definition builder.h:1574
void apply(T &result, const process::process_identifier &x)
Definition builder.h:1377
void apply(T &result, const process::process_instance &x)
Definition builder.h:1403
void apply(T &result, const process::delta &x)
Definition builder.h:1419
void apply(T &result, const process::process_instance_assignment &x)
Definition builder.h:1411
void apply(T &result, const process::stochastic_operator &x)
Definition builder.h:1557
void apply(T &result, const process::choice &x)
Definition builder.h:1549
void apply(T &result, const process::at &x)
Definition builder.h:1493
void apply(T &result, const process::merge &x)
Definition builder.h:1533
void apply(T &result, const process::if_then &x)
Definition builder.h:1509
void apply(T &result, const process::comm &x)
Definition builder.h:1469
void apply(T &result, const process::process_equation &x)
Definition builder.h:1386
void apply(T &result, const process::left_merge &x)
Definition builder.h:1541
void apply(T &result, const process::sync &x)
Definition builder.h:1485
void apply(T &result, const process::tau &x)
Definition builder.h:1428
void update(process::process_specification &x)
Definition builder.h:1366
void apply(T &result, const process::hide &x)
Definition builder.h:1453
void apply(T &result, const process::if_then_else &x)
Definition builder.h:1517
void apply(T &result, const process::untyped_process_assignment &x)
Definition builder.h:1565
void apply(T &result, const process::rename &x)
Definition builder.h:1461
void apply(T &result, const process::seq &x)
Definition builder.h:1501
void apply(T &result, const process::block &x)
Definition builder.h:1445
void apply(T &result, const process::sum &x)
Definition builder.h:1437
void apply(T &result, const process::bounded_init &x)
Definition builder.h:1525
void apply(T &result, const process::action &x)
Definition builder.h:1394
void apply(T &result, const process::allow &x)
Definition builder.h:1477
void update(process::process_specification &x)
Definition builder.h:59
void apply(T &result, const process::sync &x)
Definition builder.h:188
void apply(T &result, const process::choice &x)
Definition builder.h:252
void apply(T &result, const process::process_instance_assignment &x)
Definition builder.h:114
void apply(T &result, const process::process_instance &x)
Definition builder.h:106
void apply(T &result, const process::merge &x)
Definition builder.h:236
void apply(T &result, const process::seq &x)
Definition builder.h:204
void apply(T &result, const process::if_then &x)
Definition builder.h:212
void apply(T &result, const process::untyped_multi_action &x)
Definition builder.h:90
void apply(T &result, const process::stochastic_operator &x)
Definition builder.h:260
void apply(T &result, const process::action &x)
Definition builder.h:98
void apply(T &result, const process::delta &x)
Definition builder.h:122
void apply(T &result, const process::if_then_else &x)
Definition builder.h:220
void apply(T &result, const process::left_merge &x)
Definition builder.h:244
void apply(T &result, const process::process_equation &x)
Definition builder.h:82
void apply(T &result, const process::hide &x)
Definition builder.h:156
void apply(T &result, const process::allow &x)
Definition builder.h:180
void apply(T &result, const process::rename &x)
Definition builder.h:164
void apply(T &result, const process::comm &x)
Definition builder.h:172
void apply(T &result, const process::sum &x)
Definition builder.h:140
void apply(T &result, const process::bounded_init &x)
Definition builder.h:228
void apply(T &result, const process::action_label &x)
Definition builder.h:52
void apply(T &result, const process::block &x)
Definition builder.h:148
void apply(T &result, const process::at &x)
Definition builder.h:196
void apply(T &result, const process::tau &x)
Definition builder.h:131
void apply(T &result, const process::process_identifier &x)
Definition builder.h:74
void apply(T &result, const process::process_expression &x)
Definition builder.h:276
void apply(T &result, const process::untyped_process_assignment &x)
Definition builder.h:268
void apply(const process::sync &x)
Definition traverser.h:1749
void apply(const process::if_then_else &x)
Definition traverser.h:1779
void apply(const process::block &x)
Definition traverser.h:1714
void apply(const process::untyped_process_assignment &x)
Definition traverser.h:1826
void apply(const process::bounded_init &x)
Definition traverser.h:1787
void apply(const process::sum &x)
Definition traverser.h:1707
void apply(const process::hide &x)
Definition traverser.h:1721
void apply(const process::process_specification &x)
Definition traverser.h:1656
void apply(const process::action &x)
Definition traverser.h:1672
void apply(const process::left_merge &x)
Definition traverser.h:1803
void apply(const process::process_expression &x)
Definition traverser.h:1833
void apply(const process::comm &x)
Definition traverser.h:1735
void apply(const process::rename &x)
Definition traverser.h:1728
void apply(const process::tau &x)
Definition traverser.h:1700
void apply(const process::process_instance_assignment &x)
Definition traverser.h:1686
void apply(const process::action_label &x)
Definition traverser.h:1649
void apply(const process::stochastic_operator &x)
Definition traverser.h:1819
void apply(const process::choice &x)
Definition traverser.h:1811
void apply(const process::process_equation &x)
Definition traverser.h:1665
void apply(const process::if_then &x)
Definition traverser.h:1772
void apply(const process::process_instance &x)
Definition traverser.h:1679
void apply(const process::delta &x)
Definition traverser.h:1693
void apply(const process::merge &x)
Definition traverser.h:1795
void apply(const process::allow &x)
Definition traverser.h:1742
void apply(const process::seq &x)
Definition traverser.h:1764
void apply(const process::left_merge &x)
Definition traverser.h:536
void apply(const process::choice &x)
Definition traverser.h:544
void apply(const process::stochastic_operator &x)
Definition traverser.h:552
void apply(const process::action &x)
Definition traverser.h:402
void apply(const process::allow &x)
Definition traverser.h:472
void apply(const process::if_then_else &x)
Definition traverser.h:511
void apply(const process::process_specification &x)
Definition traverser.h:380
void apply(const process::bounded_init &x)
Definition traverser.h:520
void apply(const process::untyped_multi_action &x)
Definition traverser.h:395
void apply(const process::process_instance &x)
Definition traverser.h:409
void apply(const process::delta &x)
Definition traverser.h:423
void apply(const process::merge &x)
Definition traverser.h:528
void apply(const process::process_expression &x)
Definition traverser.h:567
void apply(const process::block &x)
Definition traverser.h:444
void apply(const process::process_equation &x)
Definition traverser.h:388
void apply(const process::if_then &x)
Definition traverser.h:503
void apply(const process::untyped_process_assignment &x)
Definition traverser.h:560
void apply(const process::process_instance_assignment &x)
Definition traverser.h:416
void apply(const process::rename &x)
Definition traverser.h:458
void apply(const process::process_expression &x)
Definition traverser.h:1533
void apply(const process::process_specification &x)
Definition traverser.h:1300
void apply(const process::bounded_init &x)
Definition traverser.h:1484
void apply(const process::untyped_multi_action &x)
Definition traverser.h:1350
void apply(const process::process_identifier &x)
Definition traverser.h:1310
void apply(const process::communication_expression &x)
Definition traverser.h:1335
void apply(const process::process_equation &x)
Definition traverser.h:1318
void apply(const process::untyped_process_assignment &x)
Definition traverser.h:1525
void apply(const process::if_then_else &x)
Definition traverser.h:1475
void apply(const process::rename_expression &x)
Definition traverser.h:1327
void apply(const process::action_name_multiset &x)
Definition traverser.h:1343
void apply(const process::left_merge &x)
Definition traverser.h:1500
void apply(const process::stochastic_operator &x)
Definition traverser.h:1516
void apply(const process::if_then &x)
Definition traverser.h:1467
void apply(const process::process_instance &x)
Definition traverser.h:1365
void apply(const process::process_instance_assignment &x)
Definition traverser.h:1373
void apply(const process::action_label &x)
Definition traverser.h:1292
void apply(const process::process_instance &x)
Definition traverser.h:705
void apply(const process::process_expression &x)
Definition traverser.h:859
void apply(const process::left_merge &x)
Definition traverser.h:829
void apply(const process::stochastic_operator &x)
Definition traverser.h:845
void apply(const process::if_then_else &x)
Definition traverser.h:805
void apply(const process::if_then &x)
Definition traverser.h:798
void apply(const process::process_instance_assignment &x)
Definition traverser.h:712
void apply(const process::bounded_init &x)
Definition traverser.h:813
void apply(const process::untyped_process_assignment &x)
Definition traverser.h:852
void apply(const process::process_specification &x)
Definition traverser.h:683
void apply(const process::process_equation &x)
Definition traverser.h:691
void apply(const process::process_instance &x)
Definition traverser.h:102
void apply(const process::process_equation &x)
Definition traverser.h:78
void apply(const process::process_specification &x)
Definition traverser.h:61
void apply(const process::block &x)
Definition traverser.h:140
void apply(const process::process_identifier &x)
Definition traverser.h:71
void apply(const process::rename &x)
Definition traverser.h:154
void apply(const process::allow &x)
Definition traverser.h:168
void apply(const process::delta &x)
Definition traverser.h:118
void apply(const process::merge &x)
Definition traverser.h:224
void apply(const process::action &x)
Definition traverser.h:94
void apply(const process::action_label &x)
Definition traverser.h:54
void apply(const process::process_instance_assignment &x)
Definition traverser.h:110
void apply(const process::untyped_process_assignment &x)
Definition traverser.h:257
void apply(const process::bounded_init &x)
Definition traverser.h:216
void apply(const process::choice &x)
Definition traverser.h:240
void apply(const process::if_then &x)
Definition traverser.h:199
void apply(const process::stochastic_operator &x)
Definition traverser.h:248
void apply(const process::process_expression &x)
Definition traverser.h:264
void apply(const process::left_merge &x)
Definition traverser.h:232
void apply(const process::untyped_multi_action &x)
Definition traverser.h:87
void apply(const process::if_then_else &x)
Definition traverser.h:207
void apply(const process::sync &x)
Definition traverser.h:1087
void apply(const process::process_equation &x)
Definition traverser.h:991
void apply(const process::comm &x)
Definition traverser.h:1073
void apply(const process::bounded_init &x)
Definition traverser.h:1128
void apply(const process::if_then_else &x)
Definition traverser.h:1119
void apply(const process::choice &x)
Definition traverser.h:1152
void apply(const process::tau &x)
Definition traverser.h:1037
void apply(const process::allow &x)
Definition traverser.h:1080
void apply(const process::process_instance &x)
Definition traverser.h:1014
void apply(const process::merge &x)
Definition traverser.h:1136
void apply(const process::process_specification &x)
Definition traverser.h:975
void apply(const process::process_identifier &x)
Definition traverser.h:984
void apply(const process::at &x)
Definition traverser.h:1095
void apply(const process::sum &x)
Definition traverser.h:1044
void apply(const process::untyped_multi_action &x)
Definition traverser.h:1000
void apply(const process::left_merge &x)
Definition traverser.h:1144
void apply(const process::stochastic_operator &x)
Definition traverser.h:1160
void apply(const process::process_instance_assignment &x)
Definition traverser.h:1022
void apply(const process::if_then &x)
Definition traverser.h:1111
void apply(const process::hide &x)
Definition traverser.h:1059
void apply(const process::seq &x)
Definition traverser.h:1103
void apply(const process::process_expression &x)
Definition traverser.h:1176
void apply(const process::rename &x)
Definition traverser.h:1066
void apply(const process::block &x)
Definition traverser.h:1052
void apply(const process::untyped_process_assignment &x)
Definition traverser.h:1169
void apply(const process::delta &x)
Definition traverser.h:1030
void apply(const process::action &x)
Definition traverser.h:1007
void apply(T &result, const process::process_instance &x)
Definition builder.h:760
void apply(T &result, const process::choice &x)
Definition builder.h:906
void apply(T &result, const process::sync &x)
Definition builder.h:842
void apply(T &result, const process::sum &x)
Definition builder.h:794
void apply(T &result, const process::stochastic_operator &x)
Definition builder.h:914
void apply(T &result, const process::untyped_process_assignment &x)
Definition builder.h:922
void apply(T &result, const process::allow &x)
Definition builder.h:834
void apply(T &result, const process::bounded_init &x)
Definition builder.h:882
void apply(T &result, const process::comm &x)
Definition builder.h:826
void apply(T &result, const process::block &x)
Definition builder.h:802
void apply(T &result, const process::tau &x)
Definition builder.h:785
void apply(T &result, const process::action &x)
Definition builder.h:752
void apply(T &result, const process::left_merge &x)
Definition builder.h:898
void apply(T &result, const process::untyped_multi_action &x)
Definition builder.h:744
void apply(T &result, const process::merge &x)
Definition builder.h:890
void apply(T &result, const process::seq &x)
Definition builder.h:858
void apply(T &result, const process::delta &x)
Definition builder.h:776
void apply(T &result, const process::hide &x)
Definition builder.h:810
void apply(T &result, const process::at &x)
Definition builder.h:850
void apply(T &result, const process::process_identifier &x)
Definition builder.h:728
void apply(T &result, const process::if_then_else &x)
Definition builder.h:874
void update(process::process_specification &x)
Definition builder.h:716
void apply(T &result, const process::process_equation &x)
Definition builder.h:736
void apply(T &result, const process::process_instance_assignment &x)
Definition builder.h:768
void apply(T &result, const process::rename &x)
Definition builder.h:818
void apply(T &result, const process::if_then &x)
Definition builder.h:866
void apply(T &result, const process::process_expression &x)
Definition builder.h:930
void apply(T &result, const process::process_instance_assignment &x)
void apply(T &result, const stochastic_operator &x)
add_capture_avoiding_replacement(data::detail::capture_avoiding_substitution_updater< Substitution > &sigma)
data::assignment_list::const_iterator find_variable(const data::assignment_list &a, const data::variable &v) const
void check_not_empty(const Container &c, const std::string &msg, const process_expression &x)
Definition typecheck.h:171
void check_action_declared(const core::identifier_string &a, const process_expression &x)
Definition typecheck.h:149
action typecheck_action(const core::identifier_string &name, const data::data_expression_list &parameters)
Definition typecheck.h:227
typecheck_builder(data::data_type_checker &data_typechecker, const data::detail::variable_context &variable_context, const detail::process_context &process_context, const detail::action_context &action_context, const process_identifier *current_equation=nullptr)
Definition typecheck.h:131
void apply(T &result, const untyped_process_assignment &x)
Definition typecheck.h:276
const detail::process_context & m_process_context
Definition typecheck.h:127
void apply(T &result, const process::stochastic_operator &x)
Definition typecheck.h:601
void apply(T &result, const data::untyped_data_parameter &x)
Definition typecheck.h:354
data::data_type_checker & m_data_type_checker
Definition typecheck.h:125
void apply(T &result, const process::hide &x)
Definition typecheck.h:379
process_instance typecheck_process_instance(const core::identifier_string &name, const data::data_expression_list &parameters)
Definition typecheck.h:232
void apply(T &result, const process::if_then &x)
Definition typecheck.h:566
void check_duplicates_in_assignments(const data::untyped_identifier_assignment_list &assignments)
Definition typecheck.h:203
void check_rename_common_type(const core::identifier_string &a, const core::identifier_string &b, const process_expression &x)
Definition typecheck.h:195
bool is_action_name(const core::identifier_string &name)
Definition typecheck.h:217
void check_actions_declared(const core::identifier_string_list &act_list, const process_expression &x)
Definition typecheck.h:157
bool is_process_name(const core::identifier_string &name)
Definition typecheck.h:222
void check_not_equal(const T &first, const T &second, const std::string &msg, const process_expression &x)
Definition typecheck.h:180
void apply(T &result, const process::sum &x)
Definition typecheck.h:583
void check_assignments(const process_identifier &P, const process_identifier &Q, const std::vector< data::assignment > &assignments, const untyped_process_assignment &x) const
Definition typecheck.h:255
void apply(T &result, const process::allow &x)
Definition typecheck.h:532
data::detail::variable_context m_variable_context
Definition typecheck.h:126
const process_identifier * m_current_equation
Definition typecheck.h:129
void apply(T &result, const process::block &x)
Definition typecheck.h:389
static bool has_empty_intersection(const std::set< data::sort_expression_list > &s1, const std::set< data::sort_expression_list > &s2)
Definition typecheck.h:188
void apply(T &result, const process::action &x)
Definition typecheck.h:373
void apply(T &result, const process::rename &x)
Definition typecheck.h:397
std::string print_untyped_process_assignment(const untyped_process_assignment &x) const
Definition typecheck.h:241
std::set< data::sort_expression_list > action_sorts(const core::identifier_string &name)
Definition typecheck.h:144
void apply(T &result, const process::if_then_else &x)
Definition typecheck.h:573
void apply(T &result, const process::at &x)
Definition typecheck.h:559
void apply(T &result, const process::comm &x)
Definition typecheck.h:418
const detail::action_context & m_action_context
Definition typecheck.h:128
Base builder class for processes.
Definition builder.h:25
void apply(T &result, const data::untyped_data_parameter &x)
Definition builder.h:30
Base class for action_formula_traverser.
Definition traverser.h:31
void apply(const data::untyped_data_parameter &x)
Definition traverser.h:37
\brief Builder class
Definition builder.h:1033
make_substitution(const std::map< process_identifier, process_identifier > &map)
process_identifier operator()(const process_identifier &id) const
const std::map< process_identifier, process_identifier > & m_map
std::size_t operator()(const mcrl2::lps::multi_action &ma) const
std::size_t operator()(const mcrl2::process::action &t) const