mCRL2
Loading...
Searching...
No Matches
simple_list.h
Go to the documentation of this file.
1// Author(s): David N. Jansen, Institute of Software, Chinese Academy of
2// Sciences, Beijing, PR China
3//
4// Copyright: see the accompanying file COPYING or copy at
5// https://github.com/mCRL2org/mCRL2/blob/master/COPYING
6//
7// Distributed under the Boost Software License, Version 1.0.
8// (See accompanying file LICENSE_1_0.txt or copy at
9// http://www.boost.org/LICENSE_1_0.txt)
10
11/// \file lts/detail/simple_list.h
12///
13/// \brief Simple list implementation (with pool allocator)
14///
15/// \details This file supports partition refinement algorithms by implementing
16/// a simple list data structure, possibly with a pool allocator.
17///
18/// The main difference to std::list<T> is that the simple list only stores
19/// a pointer to the first list element; there is no sentinel. The list
20/// elements themselves form a doubly-linked list that is almost circular; only
21/// the pointer from the last element to the next one is nullptr. This allows
22/// to find the last element in the list (namely as predecessor of the first).
23/// A disadvantage is that the list does not allow to find the last element
24/// through `std::prev(end())`; to alleviate this, we offer a separate function
25/// `before_end()`.
26///
27/// Also, a simple list requires the stored elements to be trivially
28/// destructible, so they can be stored in a pool allocator data structure.
29///
30/// The pool allocator uses larger blocks to allocate data items,
31/// mostly list elements, but also other items can be stored, as long
32/// as they are trivially destructible. To access the pool, one uses
33/// `simple_list<element type>::get_pool()`. However, only elements of the
34/// same size as `simple_list<element type>` entries can be deleted. This is
35/// a static pool that is available throughout the running time of the program.
36/// (If you are really concerned about shaving off every small bit of time,
37/// you might destroy the pool through a memory leak upon termination of the
38/// program -- to that end, modify the destructor of `my_pool` to do nothing.)
39///
40/// \author David N. Jansen, Institute of Software, Chinese Academy of
41/// Sciences, Beijing, PR China
42
43#ifndef SIMPLE_LIST_H
44#define SIMPLE_LIST_H
45
46#include <cstddef> // for std::size_t
47#include <new> // for placement new
48#include <type_traits> // for std::is_trivially_destructible<class>
49#include <functional> // for std::less
50#include <iterator> // for std::forward_iterator_tag
51
52// My provisional recommendation is to always use simple lists and pool
53// allocators. Using standard allocation and standard lists is 5-15% slower
54// and uses perhaps 0.7% more memory. Using standard allocation and simple
55// lists is 10-20% slower and has no significant effect on memory use. These
56// numbers are based on a small set with not-so-large case studies for the JGKW
57// bisimulation minimisation algorithm, none of which includes new bottom
58// states.
59
60#define USE_SIMPLE_LIST
61
62#ifndef USE_SIMPLE_LIST
63 #include <list>
64#endif
65
66#define USE_POOL_ALLOCATOR
67
68namespace mcrl2::lts::detail
69{
70
71
72
73
74
75/* ************************************************************************* */
76/* */
77/* M E M O R Y M A N A G E M E N T */
78/* */
79/* ************************************************************************* */
80
81
82
83
84
86 /// \cond INTERNAL_DOCS
87 #define ONLY_IF_POOL_ALLOCATOR(...) __VA_ARGS__ // NOLINT(cppcoreguidelines-macro-usage)
88 #ifndef USE_SIMPLE_LIST
89 #error "Using the pool allocator also requires using the simple list"
90 #endif
91
92 /// \class pool
93 /// \brief a pool allocator class
94 /// \details This class allocates a large chunk of memory at once and hands
95 /// out smaller parts. It is supposed to be more efficient than calling
96 /// new/delete, in particular because it assumes that T is trivially
97 /// destructible, so it won't call destructors. It allows to store
98 /// elements of different sizes.
99 ///
100 /// Internally, it keeps a (single-linked) list of large chunks of size
101 /// NR_ELEMENTS*sizeof(T)+sizeof(pointer). Each chunk contains a data area; for all chunks except the
102 /// first one, this area is completely in use.
103 ///
104 /// There is a free list, a (single-linked) list of elements in the chunks
105 /// that have been freed. However, all elements in the free list have to
106 /// have the same size as type T.
107 template <class T, std::size_t NR_ELEMENTS = 4000>
108 class my_pool
109 {
110 static_assert(std::is_trivially_destructible_v<T>);
111 private:
112 static_assert(sizeof(void*) <= sizeof(T));
113 class pool_block_t
114 {
115 public:
116 char data[NR_ELEMENTS * sizeof(T)]{}; // NOLINT(cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays) raw storage for the pool allocator
117 pool_block_t* next_block;
118
119 pool_block_t(pool_block_t* const new_next_block)
120 : next_block(new_next_block)
121 {}
122 }; static_assert(sizeof(T) <= sizeof(pool_block_t::data));
123
124 /// \brief first chunk in list of chunks
125 /// \details All chunks except the first one are completely in use.
126 pool_block_t* first_block;
127
128 /// \brief start of part in the first chunk that is already in use
129 void* begin_used_in_first_block;
130
131 /// \brief first freed element
132 void* first_free_T = nullptr;
133
134 static void*& deref_void(void* addr)
135 {
136 return *static_cast<void**>(addr);
137 }
138 public:
139 /// \brief constructor
140 my_pool()
141 : first_block(new pool_block_t(nullptr)),
142 begin_used_in_first_block(
143 &first_block->data[sizeof(first_block->data)])
144 {}
145
146
147 /// \brief destructor
148 ~my_pool()
149 {
150 pool_block_t* block(first_block); assert(nullptr != block);
151 do
152 {
153 pool_block_t* next_block = block->next_block;
154 delete block;
155 block = next_block;
156 }
157 while(nullptr != block);
158 }
159
160
161 private:
162 /// \brief allocate and construct a new element of the same size as the
163 /// free list
164 template <class U, class... Args>
165 U* construct_samesize(Args&&... args)
166 { static_assert(sizeof(T) == sizeof(U));
167 void* new_el; assert(nullptr != first_block);
168 if (first_block->data + sizeof(U) <= begin_used_in_first_block)
169 {
170 begin_used_in_first_block =
171 new_el = static_cast<char*>(begin_used_in_first_block) -
172 sizeof(U);
173 }
174 else if (nullptr != first_free_T)
175 {
176 // free list is tested afterwards because I expect that there
177 // won't be too many elements in the free list.
178 new_el = first_free_T;
179 first_free_T = deref_void(new_el);
180 }
181 else
182 {
183 first_block = new pool_block_t(first_block);
184 begin_used_in_first_block =
185 new_el = &first_block->data[sizeof(first_block->data) -
186 sizeof(U)];
187 }
188 return new(new_el) U(std::forward<Args>(args)...);
189 }
190
191
192 /// \brief allocate and construct a new element of a size that doesn't
193 /// fit the free list
194 template <class U, class... Args>
195 U* construct_othersize(Args&&... args)
196 { static_assert(sizeof(U) != sizeof(T));
197 void* new_el; assert(nullptr != first_block);
198 if (first_block->data + sizeof(U) <= begin_used_in_first_block)
199 {
200 begin_used_in_first_block =
201 new_el = static_cast<char*>(begin_used_in_first_block) -
202 sizeof(U);
203 }
204 else
205 {
206 if constexpr (sizeof(T) * 2 < sizeof(U))
207 {
208 // There may be space for several T-elements,
209 // extend the free list accordingly
210 while (first_block->data + sizeof(T) <=
211 begin_used_in_first_block)
212 {
213 begin_used_in_first_block = static_cast<char*>
214 (begin_used_in_first_block) - sizeof(T);
215 deref_void(begin_used_in_first_block) = first_free_T;
216 first_free_T = begin_used_in_first_block;
217 }
218 }
219 else if constexpr (sizeof(T) < sizeof(U))
220 {
221 // There may be space for one T-element (but not more),
222 // extend the free list accordingly
223 if (first_block->data + sizeof(T) <=
224 begin_used_in_first_block)
225 {
226 begin_used_in_first_block = static_cast<char*>
227 (begin_used_in_first_block) - sizeof(T);
228 deref_void(begin_used_in_first_block) = first_free_T;
229 first_free_T = begin_used_in_first_block;
230 }
231 } assert(first_block->data + sizeof(T) > begin_used_in_first_block);
232 first_block = new pool_block_t(first_block);
233 begin_used_in_first_block =
234 new_el = &first_block->data[sizeof(first_block->data) -
235 sizeof(U)];
236 }
237 return new(new_el) U(std::forward<Args>(args)...);
238 }
239 public:
240 /// \brief allocate and construct a new element (of any type)
241 template <class U, class... Args>
242 U* construct(Args&&... args)
243 {
244 static_assert(std::is_trivially_destructible_v<U>);
245 if constexpr (sizeof(U) == sizeof(T))
246 {
247 return construct_samesize<U>(std::forward<Args>(args)...);
248 }
249 else
250 { static_assert(sizeof(U) <= sizeof(first_block->data));
251 return construct_othersize<U>(std::forward<Args>(args)...);
252 }
253 }
254
255
256 /// \brief destroy and delete some element
257 /// \details destroy() is only allowed if the destructor of U is
258 /// trivial. This ensures that in my_pool::~my_pool() we do not have
259 /// to test whether some element has been freed before we destroy it.
260 /// Also, the size of U has to be the same size as the size of T, so
261 /// each entry in the free list has the same size.
262 template <class U>
263 void destroy(U* const old_el)
264 { static_assert(sizeof(T) == sizeof(U));
265 old_el->~U();
266 static_assert(std::is_trivially_destructible_v<U>);
267#ifndef NDEBUG
268 // ensure that old_el points to an element in some block
269 static std::less<const void*> const total_order; // NOLINT(modernize-use-transparent-functors) explicit type required to compare differing pointer types
270 for (const pool_block_t* block(first_block);
271 assert(nullptr != block),
272 total_order(old_el, block->data) ||
273 total_order(&block->data[sizeof(block->data)], old_el + 1);
274 block = block->next_block )
275 { }
276 #endif
277 deref_void(old_el) = first_free_T;
278 first_free_T = static_cast<void*>(old_el);
279 }
280 };
281#else
282 #define ONLY_IF_POOL_ALLOCATOR(...)
283 /// \endcond
284#endif // #define USE_POOL_ALLOCATOR
285
286#ifdef USE_SIMPLE_LIST
287 /// \class simple_list
288 /// \brief a simple implementation of lists
289 /// \details This class simplifies lists: It assumes that list entries are
290 /// trivially destructible, and it does not store the size of a list.
291 /// Therefore, the destructor, erase() and splice() can be simplified.
292 /// Also, the simple_list object itself is trivially destructible if the
293 /// pool allocator is used; therefore, destroying a block_t object becomes
294 /// trivial as well.
295 template <class T>
296 class simple_list
297 {
298 public:
299 class const_iterator;
300
301 #ifndef USE_POOL_ALLOCATOR
302 private:
303 #endif
304 /// \brief list entry
305 /// \details If the list is to use the pool allocator, its designated
306 /// type must be `simple_list::entry` so elements can be erased.
307 class entry
308 {
309 private:
310 entry* next;
311 entry* prev;
312 T data;
313
314 friend class simple_list;
315 friend class const_iterator;
316 friend class my_pool<entry>;
317
318 template <class... Args>
319 entry(entry* const new_next, entry* const new_prev, Args&&... args)
320 : next(new_next),
321 prev(new_prev),
322 data(std::forward<Args>(args)...)
323 { }
324 };
325
326 private:
327 /// \brief pointer to the beginning of the list
328 entry* first;
329
330 public:
331 #ifdef USE_POOL_ALLOCATOR
332 static my_pool<entry>& get_pool()
333 {
334 static my_pool<entry> pool;
335
336 return pool;
337 }
338 #endif
339
340 /// \brief constant iterator class for simple_list
341 class const_iterator
342 {
343 public:
344 using value_type = T;
345 using pointer = T*;
346 using reference = T&;
347 using difference_type = std::ptrdiff_t;
348 using iterator_category = std::forward_iterator_tag;
349 protected:
350 entry* ptr;
351
352 const_iterator(const entry* const new_ptr)
353 : ptr(const_cast<entry*>(new_ptr))
354 { }
355
356 friend class simple_list;
357 public:
358 const_iterator() = default;
359 const_iterator(const const_iterator& other) = default;
360 const_iterator& operator=(const const_iterator& other) = default;
361
362 const_iterator& operator++()
363 { assert(nullptr != ptr);
364 ptr = ptr->next;
365 return *this;
366 }
367
368 const_iterator& operator--()
369 { assert(nullptr != ptr);
370 ptr = ptr->prev; assert(nullptr != ptr->next);
371 return *this;
372 }
373
374 const_iterator operator++(int)
375 { assert(nullptr != ptr);
376 const_iterator temp(*this);
377 ptr = ptr->next;
378 return temp;
379 }
380
381 const_iterator operator--(int)
382 { assert(nullptr != ptr);
383 const_iterator temp(*this);
384 ptr = ptr->prev; assert(nullptr != ptr->next);
385 return temp;
386 }
387
388 const T& operator*() const
389 { assert(nullptr != ptr);
390 return ptr->data;
391 }
392
393 const T* operator->() const
394 { assert(nullptr != ptr);
395 return &ptr->data;
396 }
397
398 bool operator==(const const_iterator& other) const
399 {
400 return ptr == other.ptr;
401 }
402
403 bool operator==(const T* const other) const
404 { assert(nullptr != other);
405 // It is allowed to call this even if is_null().
406 return ptr != nullptr && operator->() == other;
407 }
408
409 };
410
411 /// \brief iterator class for simple_list
412 class iterator : public const_iterator
413 {
414 public:
415 using typename const_iterator::value_type;
416 using typename const_iterator::pointer;
417 using typename const_iterator::reference;
418 using typename const_iterator::difference_type;
419 using typename const_iterator::iterator_category;
420 protected:
421 iterator(entry* const new_ptr) : const_iterator(new_ptr) { }
422
423 friend class simple_list;
424 public:
425 iterator() = default;
426
427 iterator(const iterator& other) = default;
428
429 iterator& operator=(const iterator& other) = default;
430
431 iterator& operator++(){const_iterator::operator++(); return *this;}
432
433 iterator& operator--(){const_iterator::operator--(); return *this;}
434
435 iterator operator++(int)
436 {
437 iterator temp(*this);
438 const_iterator::operator++();
439 return temp;
440 }
441
442 iterator operator--(int)
443 {
444 iterator temp(*this);
445 const_iterator::operator--();
446 return temp;
447 }
448
449 T& operator*() const
450 {
451 return const_cast<T&>(const_iterator::operator*());
452 }
453
454 T* operator->() const
455 {
456 return const_cast<T*>(const_iterator::operator->());
457 }
458 };
459
460 /// \brief class that stores either an iterator or a null value
461 /// \details We cannot use C++14's "null forward iterators", as they
462 /// are not guaranteed to compare unequal to valid iterators. We also
463 /// need to compare null iterators with non-null ones.
464 class iterator_or_null : public iterator
465 {
466 public:
467 using typename iterator::value_type;
468 using typename iterator::pointer;
469 using typename iterator::reference;
470 using typename iterator::difference_type;
471 using typename iterator::iterator_category;
472 using iterator::operator*;
473 using iterator::operator->;
474
475 iterator_or_null() : iterator() { }
476
477 iterator_or_null(std::nullptr_t) : iterator()
478 {
479 const_iterator::ptr = nullptr;
480 }
481
482 iterator_or_null(const iterator& other) : iterator(other) { }
483
484 bool is_null() const { return nullptr == const_iterator::ptr; }
485
486 iterator_or_null& operator=(std::nullptr_t)
487 {
488 const_iterator::ptr = nullptr;
489 return *this;
490 }
491 };
492
493 /// \brief constructor
494 simple_list()
495 : first(nullptr)
496 {
497 static_assert(std::is_trivially_destructible_v<entry>);
498 }
499
500 #ifndef USE_POOL_ALLOCATOR
501 /// \brief destructor
502 ~simple_list()
503 {
504 for (iterator iter = begin(); end() != iter; )
505 {
506 iterator next = std::next(iter);
507 delete iter.ptr;
508 iter = next;
509 }
510 }
511 #endif
512
513 /// \brief return true iff the list is empty
514 bool empty() const { return nullptr==first; }
515
516 /// \brief return an iterator to the first element of the list
517 iterator begin() { return iterator(first); }
518
519 /// \brief return an iterator past the last element of the list
520 static iterator end() { return iterator(nullptr); }
521
522 /// \brief return a constant iterator to the first element of the list
523 const_iterator cbegin() const { return const_iterator(first); }
524
525 /// \brief return a constant iterator past the last element of the list
526 static const_iterator cend() { return end(); }
527
528 /// \brief return a constant iterator to the first element of the list
529 const_iterator begin() const { return cbegin(); }
530
531 /// \brief return an iterator to the last element of the list
532 iterator before_end()
533 { assert(!empty());
534 return iterator(first->prev);
535 }
536
537 const_iterator before_end() const
538 { assert(!empty());
539 return const_iterator(first->prev);
540 }
541
542 /// \brief return a reference to the first element of the list
543 T& front()
544 { assert(!empty());
545 return first->data;
546 }
547
548 /// \brief return a reference to the last element of the list
549 T& back()
550 { assert(!empty());
551 return first->prev->data;
552 }
553 [[nodiscard]]
554 bool check_linked_list() const
555 {
556 if (empty())
557 {
558 return true;
559 }
560 const_iterator i = first;
561 if (nullptr == i.ptr->prev)
562 {
563 return false;
564 }
565 while (nullptr != i.ptr->next)
566 {
567 if (i.ptr->next->prev != i.ptr)
568 {
569 return false;
570 }
571 ++i;
572 assert(i.ptr->prev->next == i.ptr);
573 }
574 return first->prev == i.ptr;
575 }
576 /// \brief construct a new list entry before pos
577 /// \details If pos==end(), construct a new list entry at the end
578 template<class... Args>
579 iterator emplace(iterator pos, Args&&... args)
580 { assert(end()==pos || !empty()); assert(end()==pos || nullptr!=pos.ptr->prev);
581 #ifndef NDEBUG
582 assert(check_linked_list());
583 if (end() != pos)
584 { for(const_iterator i=begin(); i!=pos; ++i) { assert(end()!=i); } }
585 #endif
586 entry* const prev = end() == pos
587 ? (empty() ? nullptr : first->prev)
588 : pos.ptr->prev;
589 entry* const new_entry(
590 #ifdef USE_POOL_ALLOCATOR
591 get_pool().template construct<entry>
592 #else
593 new entry
594 #endif
595 (pos.ptr, prev, std::forward<Args>(args)...));
596 if (begin() == pos)
597 {
598 // we insert a new element before the current list begin, so
599 // the begin should change. This includes the case that the
600 // list was empty before.
601 first = new_entry;
602 }
603 else if (nullptr != prev)
604 {
605 // We insert an element not at the current list begin, so it
606 // should be reachable from its predecessor.
607 prev->next = new_entry;
608 }
609 if (end() != pos)
610 {
611 pos.ptr->prev = new_entry;
612 }
613 else
614 { assert(nullptr != first);
615 first->prev = new_entry;
616 } assert(check_linked_list());
617 #ifndef NDEBUG
618 assert((end() == pos ? before_end() : pos.ptr->prev) == new_entry);
619 for (const_iterator i=begin(); i != new_entry; ++i) { assert(end() != i); }
620 #endif
621 return iterator(new_entry);
622 }
623
624
625 /// Puts a new element at the end.
626 template <class... Args>
627 iterator emplace_back(Args&&... args)
628 {
629 return emplace(end(), std::forward<Args>(args)...);
630 }
631
632
633 /// \brief construct a new list entry after pos
634 /// \details if pos==end(), the new list entry is created at the front.
635 template<class... Args>
636 iterator emplace_after(iterator pos, Args&&... args)
637 { assert(end()==pos || !empty()); assert(end()==pos || end()!=pos.ptr->prev);
638 #ifndef NDEBUG
639 assert(check_linked_list());
640 if (end() != pos) {
641 for (const_iterator i = begin(); i != pos; ++i) { assert(end() != i); }
642 }
643 #endif
644 entry* const next = end() == pos ? begin().ptr : pos.ptr->next;
645 entry* const new_entry(
646 #ifdef USE_POOL_ALLOCATOR
647 get_pool().template construct<entry>
648 #else
649 new entry
650 #endif
651 (next, pos.ptr, std::forward<Args>(args)...));
652 if (end() == pos)
653 {
654 // we insert a new element before the current list begin, so
655 // the begin should change. This includes the case that the
656 // list was empty before.
657 new_entry->prev = empty() ? new_entry : before_end().ptr;
658 first = new_entry;
659 }
660 else
661 {
662 pos.ptr->next = new_entry;
663 } assert(nullptr != first);
664 if (nullptr == next)
665 {
666 first->prev = new_entry;
667 }
668 else
669 {
670 next->prev = new_entry;
671 } assert(check_linked_list());
672 #ifndef NDEBUG
673 assert((end() == pos ? first : pos.ptr->next) == new_entry);
674 for (const_iterator i=begin(); i != new_entry; ++i) { assert(end() != i); }
675 #endif
676 return iterator(new_entry);
677 }
678
679
680 /// \brief construct a new list entry at the beginning
681 template<class... Args>
682 iterator emplace_front(Args&&... args)
683 {
684 return emplace_after(end(), std::forward<Args>(args)...);
685 }
686
687
688 /// The function moves the element pointed at by from_pos (that is in
689 /// the list indicated by the 2nd parameter) just after position to_pos
690 /// (that is in this list). If to_pos == end(), move the element to the
691 /// beginning of this list.
692 void splice_to_after(iterator const to_pos, simple_list<T>& from_list,
693 iterator const from_pos)
694 { assert(from_pos != to_pos);
695 #ifndef NDEBUG
696 assert(check_linked_list());
697 if (end() != to_pos) {
698 assert(!empty()); assert(nullptr != to_pos.ptr->prev);
699 for(const_iterator i = begin(); i!=to_pos; ++i) { assert(end() != i); }
700 }
701 assert(end() != from_pos); assert(nullptr != from_pos.ptr->prev);
702 assert(!from_list.empty()); assert(from_list.check_linked_list());
703 /* remove element from_pos from its original list */ for (const_iterator i = from_list.begin(); i != from_pos; ++i) {
704 assert(from_list.end() != i);
705 }
706 #endif
707 if (from_pos.ptr != from_list.first)
708 { assert(nullptr != from_list.first->next); // at least 2 elements in the list
709 /* not the first element in from_list */ assert(from_pos == from_pos.ptr->prev->next);
710 from_pos.ptr->prev->next = from_pos.ptr->next;
711 if (nullptr != from_pos.ptr->next)
712 {
713 /* not the last element in from_list */ assert(from_pos == from_pos.ptr->next->prev);
714 from_pos.ptr->next->prev = from_pos.ptr->prev;
715 }
716 else
717 {
718 /* last element in from_list */ assert(from_pos == from_list.first->prev);
719 from_list.first->prev = from_pos.ptr->prev;
720 }
721 }
722 else
723 {
724 /* first element in from_list */ assert(nullptr == from_pos.ptr->prev->next);
725 from_list.first = from_pos.ptr->next;
726 if (!from_list.empty())
727 {
728 /* not the last element in from_list */ assert(from_pos == from_pos.ptr->next->prev);
729 from_pos.ptr->next->prev = from_pos.ptr->prev;
730 }
731 }
732 // update the pointers of from_pos and insert from_pos into this
733 // list
734 entry* next;
735 if (end() == to_pos)
736 {
737 // we insert the element before the current list begin, so
738 // the begin should change. This includes the case that the
739 // list was empty before.
740 if (!empty())
741 {
742 from_pos.ptr->prev = before_end().ptr;
743 }
744 // else from_pos->prev = from_pos; -- will be set below.
745 next = first;
746 first = from_pos.ptr;
747 }
748 else
749 {
750 from_pos.ptr->prev = to_pos.ptr;
751 next = to_pos.ptr->next;
752 to_pos.ptr->next = from_pos.ptr;
753 } assert(nullptr != first);
754 from_pos.ptr->next = next;
755 if (nullptr == next)
756 {
757 first->prev = from_pos.ptr;
758 }
759 else
760 {
761 next->prev = from_pos.ptr;
762 } assert(check_linked_list()); assert(from_list.check_linked_list());
763 #ifndef NDEBUG
764 assert(from_pos == (end() == to_pos ? first : to_pos.ptr->next));
765 for (const_iterator i=begin(); i!=from_pos; ++i) { assert(i!=end()); }
766 if (end() != to_pos) {
767 for (const_iterator i=begin(); i!=to_pos; ++i) { assert(end() != i); }
768 }
769 #endif
770 }
771
772
773 /// \brief move a list entry from one position to another (possibly in
774 /// a different list)
775 /// The function moves the element pointed at by from_pos (that is in
776 /// the list indicated by the 2nd parameter) just before position
777 /// to_pos (that is in this list). If to_pos == end(), move the element
778 /// to the end of this list.
779 void splice(iterator const to_pos, simple_list<T>& from_list,
780 iterator const from_pos)
781 { assert(from_pos != to_pos); assert(end() == to_pos || !empty());
782 #ifndef NDEBUG
783 assert(end() == to_pos || nullptr != to_pos.ptr->prev);
784 assert(check_linked_list());
785 if (end() != to_pos) {
786 for (const_iterator i=begin(); i!=to_pos; ++i) { assert(end() != i); }
787 }
788 assert(from_list.end() != from_pos); assert(nullptr != from_pos.ptr->prev);
789 assert(!from_list.empty()); assert(from_list.check_linked_list());
790 /* remove element from_pos from its original list */ for (const_iterator i=from_list.begin(); i!=from_pos; ++i) {
791 assert(from_list.end() != i);
792 }
793 #endif
794 if (from_pos != from_list.first)
795 { assert(nullptr != from_list.first->next); // at least 2 elements in the list
796 /* not the first element in from_list */ assert(from_pos.ptr == from_pos.ptr->prev->next);
797 from_pos.ptr->prev->next = from_pos.ptr->next;
798 if (nullptr != from_pos.ptr->next)
799 {
800 /* not the last element in from_list */ assert(from_pos.ptr == from_pos.ptr->next->prev);
801 from_pos.ptr->next->prev = from_pos.ptr->prev;
802 }
803 else
804 {
805 /* last element in from_list */ assert(from_pos.ptr == from_list.first->prev);
806 from_list.first->prev = from_pos.ptr->prev;
807 }
808 }
809 else
810 {
811 /* first element in from_list */ assert(nullptr == from_pos.ptr->prev->next);
812 from_list.first = from_pos.ptr->next;
813 if (!from_list.empty())
814 {
815 /* not the last element in from_list */ assert(from_pos.ptr == from_pos.ptr->next->prev);
816 from_pos.ptr->next->prev = from_pos.ptr->prev;
817 }
818 }
819 // update the pointers of from_pos and insert from_pos into this
820 // list
821 from_pos.ptr->next = to_pos.ptr;
822 if (end() == to_pos)
823 {
824 // from_pos becomes the last element in *this
825 if (empty())
826 {
827 from_pos.ptr->prev = from_pos.ptr;
828 first = from_pos.ptr; assert(check_linked_list()); assert(from_list.check_linked_list());
829 return;
830 }
831 from_pos.ptr->prev = before_end().ptr;
832 from_pos.ptr->prev->next = from_pos.ptr;
833 first->prev = from_pos.ptr;
834 }
835 else
836 {
837 /* from_pos does not become the last element in *this */ assert(!empty());
838 from_pos.ptr->prev = to_pos.ptr->prev;
839 to_pos.ptr->prev = from_pos.ptr;
840 if (to_pos.ptr == first)
841 {
842 // we insert a new element before the current list begin,
843 // so the begin should change.
844 first = from_pos.ptr;
845 }
846 else
847 {
848 from_pos.ptr->prev->next = from_pos.ptr;
849 }
850 } assert(check_linked_list()); assert(from_list.check_linked_list());
851 #ifndef NDEBUG
852 assert((end() == to_pos ? before_end().ptr
853 : iterator(to_pos.ptr->prev)) == from_pos.ptr);
854 for (const_iterator i=begin(); i != from_pos; ++i) { assert(end() != i); }
855 if (end() != to_pos) {
856 for (const_iterator i=begin(); i!=to_pos; ++i) { assert(end() != i); }
857 }
858 #endif
859 }
860
861
862 /// \brief erase an element from a list
863 void erase(iterator const pos)
864 { assert(end() != pos); assert(nullptr != pos.ptr->prev); assert(!empty());
865 #ifndef NDEBUG
866 assert(check_linked_list());
867 for (const_iterator i = begin(); i != pos; ++i) { assert(end() != i); }
868 #endif
869 if (pos != first)
870 { assert(nullptr != first->next); // at least 2 elements in the list
871 /* not the first element */ assert(pos.ptr == pos.ptr->prev->next);
872 pos.ptr->prev->next = pos.ptr->next;
873 if (nullptr != pos.ptr->next)
874 {
875 /* not the last element */ assert(pos.ptr == pos.ptr->next->prev);
876 pos.ptr->next->prev = pos.ptr->prev;
877 }
878 else
879 {
880 /* last element */ assert(pos.ptr == first->prev);
881 first->prev = pos.ptr->prev;
882 }
883 }
884 else
885 {
886 /* first element */ assert(nullptr == pos.ptr->prev->next);
887 first = pos.ptr->next;
888 if (!empty())
889 {
890 /* not the last element */ assert(pos.ptr == pos.ptr->next->prev);
891 pos.ptr->next->prev = pos.ptr->prev;
892 }
893 }
894 #ifdef USE_POOL_ALLOCATOR
895 get_pool().destroy(pos.ptr);
896 #else
897 delete pos.ptr;
898 #endif
899 }
900
901
902 /// The function computes the successor of pos in the list. If pos is
903 /// the last element of the list, it returns end(). It is an error if
904 /// pos==end() or if pos is not in the list.
905 #ifdef NDEBUG
906 static // only in debug mode it accesses data of the list itself
907 #endif
908 iterator next(iterator pos)
909 #ifndef NDEBUG
910 const // static functions cannot be const
911 #endif
912 { assert(end() != pos);
913 #ifndef NDEBUG
914 for (const_iterator i = begin(); i != pos; ++i) { assert(end() != i); }
915 #endif
916 return iterator(pos.ptr->next);
917 }
918
919
920 /// The function computes the successor of pos in the list. If pos is
921 /// the last element of the list, it returns end(). It is an error if
922 /// pos==end() or if pos is not in the list.
923 #ifdef NDEBUG
924 static // only in debug mode it accesses data of the list itself
925 #endif
926 const_iterator next(const_iterator pos)
927 #ifndef NDEBUG
928 const // static functions cannot be const
929 #endif
930 { assert(end() != pos);
931 #ifndef NDEBUG
932 for (const_iterator i = begin(); i != pos; ++i) { assert(end() != i); }
933 #endif
934 return const_iterator(pos.ptr->next);
935 }
936
937
938 /// The function computes the predecessor of pos in the list. If pos is at
939 /// the beginning of the list, it returns end(). It is an error if
940 /// pos==end() or if pos is not in the list.
941 iterator prev(iterator pos) const
942 { assert(pos!=end());
943 #ifndef NDEBUG
944 for (const_iterator i = begin(); i != pos; ++i) { assert(end() != i); }
945 #endif
946 return begin() == pos ? end() : iterator(pos.ptr->prev);
947 }
948
949
950 /// The function computes the predecessor of pos in the list. If pos is at
951 /// the beginning of the list, it returns end(). It is an error if
952 /// pos==end() or if pos is not in the list.
953 const_iterator prev(const_iterator pos) const
954 { assert(end() != pos);
955 #ifndef NDEBUG
956 for (const_iterator i = begin(); i != pos; ++i) { assert(end() != i); }
957 #endif
958 return begin() == pos ? end() : const_iterator(pos.ptr->prev);
959 }
960
961
962 bool operator==(const simple_list& other) const
963 {
964 const_iterator it = cbegin();
965 const_iterator other_it = other.cbegin();
966 while (cend() != it)
967 {
968 if (cend() == other_it || *it != *other_it)
969 {
970 return false;
971 }
972 ++it;
973 ++other_it;
974 }
975 return end()==other_it;
976 }
977 };
978
979 template <class El>
980 using iterator_or_null_t = typename simple_list<El>::iterator_or_null;
981#else
982 #define simple_list std::list
983
984 template <class El>
986 {
987 public:
988 typedef std::list<El>::iterator iterator;
990 private:
991 const void* null;
993 public:
994 /// \brief Construct an uninitialized object
996 {
998 {
999 // We still have to internally decide whether to construct
1000 // the iterator or not so the destructor knows what to do.
1001 null = nullptr;
1002 }
1003 }
1004
1005
1006 /// \brief Construct an object containing a null pointer
1008 {
1009 null = nullptr;
1010 }
1011
1012
1013 /// \brief Construct an object containing a valid iterator
1014 explicit iterator_or_null_t(const iterator other)
1015 {
1016 new (&iter) iterator(other); assert(nullptr != null);
1017 }
1018
1019
1020 /// \brief Check whether the object contains a valid iterator
1021 bool is_null() const { return nullptr == null; }
1022
1023
1024 /// \brief Destruct an object (whether it contains a valid iterator or
1025 // not)
1027 {
1028 if constexpr (!std::is_trivially_destructible<iterator>::value)
1029 {
1030 if (!is_null()) iter.~iterator();
1031 }
1032 }
1033
1034 El* operator->()
1035 { assert(nullptr != null);
1036 return iter.operator->();
1037 }
1038 El& operator*()
1039 { assert(nullptr != null);
1040 return iter.operator*();
1041 }
1042
1043 void operator=(nullptr_t)
1044 {
1045 if constexpr (!std::is_trivially_destructible<iterator>::value)
1046 {
1047 if (!is_null()) iter.~iterator();
1048 }
1049 null = nullptr;
1050 }
1051
1052
1053 explicit operator iterator() const
1054 { assert(nullptr != null);
1055 return iter;
1056 }
1057
1058
1059 void operator=(const iterator& other)
1060 {
1061 if constexpr (!std::is_trivially_destructible<iterator>::value)
1062 {
1063 if (!is_null()) iter.~iterator();
1064 }
1065 new (&iter) iterator(other); assert(nullptr != null);
1066 }
1067
1068 /// \brief Compare the object with another iterator_or_null_t object
1069 /// \details The operator could be templated so that iterator_or_null_t
1070 /// objects of different types can be compared.
1071 bool operator==(const iterator_or_null_t other) const
1072 {
1073 if constexpr (sizeof(null) == sizeof(iter))
1074 {
1075 return &*iter == &*other.iter;
1076 }
1077 else
1078 {
1079 return (is_null() && other.is_null()) ||
1080 (!is_null() && !other.is_null() && &*iter == &*other.iter);
1081 }
1082 }
1083
1084
1085 /// \brief Compare the object with another iterator_or_null_t object
1086 bool operator!=(const iterator_or_null_t other) const
1087 {
1088 return !operator==(other);
1089 }
1090
1091
1092 /// \brief Compare the object with an iterator
1093 /// \details If the object does not contain a valid iterator, it
1094 /// compares unequal with the iterator.
1095 bool operator==(const const_iterator other) const
1096 { // assert(nullptr != &*other); -- generates a warning
1097 return (sizeof(null) == sizeof(iter) || !is_null()) &&
1098 &*iter == &*other;
1099 }
1100
1101
1102 bool operator!=(const const_iterator other) const
1103 {
1104 return !operator==(other);
1105 }
1106
1107
1108 /// \brief Compare the object with a non-null pointer
1109 /// \details If the object does not contain a valid iterator, it
1110 /// compares unequal with the pointer.
1111 bool operator==(const El* const other) const
1112 { assert(nullptr != other);
1113 return !is_null() && &*iter == other;
1114 }
1115
1116
1117 bool operator!=(const El* const other) const
1118 {
1119 return !operator==(other);
1120 }
1121 };
1122#endif
1123
1124} // end namespace detail
1125// end namespace lts
1126// end namespace mcrl2
1127
1128#endif // ifndef SIMPLE_LIST_H
#define mCRL2complexity(unit, call, info_for_debug)
Assigns work to a counter and checks for errors.
aterm & operator=(const aterm &other) noexcept=default
aterm(const aterm &other) noexcept=default
This class has user-declared copy constructor so declare default copy and move operators.
static constexpr std::size_t maximal_size_of_stack
std::array< unprotected_aterm_core, maximal_size_of_stack > m_stack
void initialise(const term_balanced_tree< Term > &tree)
const Term & dereference() const
Dereference operator.
bool equal(const iterator &other) const
Equality operator.
iterator(const term_balanced_tree< Term > &tree)
void increment()
Increments the iterator.
bool is_node() const
Returns true iff the tree is a node with a left and right subtree.
static void make_tree_helper(aterm &result, ForwardTraversalIterator &p, const std::size_t size, Transformer transformer)
term_balanced_tree & operator=(const term_balanced_tree &) noexcept=default
Assignment operator.
size_type size() const
Returns the size of the term_balanced_tree.
term_balanced_tree(term_balanced_tree &&) noexcept=default
Move constructor.
bool empty() const
Returns true if tree is empty.
static const aterm & empty_tree()
static void make_tree(aterm &result, ForwardTraversalIterator &p, const std::size_t size, Transformer transformer)
term_balanced_tree(ForwardTraversalIterator first, const std::size_t size)
Creates an term_balanced_tree with a copy of a range.
static const function_symbol & tree_single_node_function()
const aterm & left_branch() const
Get the left branch of the tree.
term_balanced_tree(const term_balanced_tree &) noexcept=default
Copy constructor.
term_balanced_tree(ForwardTraversalIterator first, const std::size_t size, Transformer transformer)
Creates an term_balanced_tree with a copy of a range, where a transformer is applied to each term bef...
static const function_symbol & tree_node_function()
const Term & operator[](std::size_t position) const
Element indexing operator.
iterator begin() const
Returns an iterator pointing to the beginning of the term_balanced_tree.
iterator end() const
Returns an iterator pointing to the end of the term_balanced_tree.
term_balanced_tree()
Default constructor. Creates an empty tree.
const aterm & right_branch() const
Get the left branch of the tree.
term_balanced_tree & operator=(term_balanced_tree &&) noexcept=default
Move assign operator.
term_balanced_tree(const aterm &tree)
Construction from aterm.
const Term & element_at(std::size_t position, std::size_t size) const
Get an element at the indicated position.
static const function_symbol & tree_empty_function()
friend void make_term_balanced_tree(term_balanced_tree< Term1 > &result, ForwardTraversalIterator p, std::size_t size, Transformer transformer)
term_balanced_tree(detail::_term_appl *t)
A list of aterm objects.
Definition aterm_list.h:26
A unordered_map class in which aterms can be stored.
action_formula(action_formula &&) noexcept=default
action_formula & operator=(const action_formula &) noexcept=default
action_formula(const atermpp::aterm &term)
action_formula(const data::data_expression &x)
\brief Constructor Z6.
action_formula(const action_formula &) noexcept=default
Move semantics.
action_formula & operator=(action_formula &&) noexcept=default
action_formula(const data::untyped_data_parameter &x)
\brief Constructor Z6.
action_formula()
\brief Default constructor X3.
action_formula(const process::untyped_multi_action &x)
\brief Constructor Z6.
\brief The and operator for action formulas
and_ & operator=(const and_ &) noexcept=default
and_ & operator=(and_ &&) noexcept=default
and_(const action_formula &left, const action_formula &right)
\brief Constructor Z14.
and_()
\brief Default constructor X3.
and_(and_ &&) noexcept=default
const action_formula & left() const
and_(const atermpp::aterm &term)
and_(const and_ &) noexcept=default
Move semantics.
const action_formula & right() const
\brief The at operator for action formulas
at(const atermpp::aterm &term)
const data::data_expression & time_stamp() const
at & operator=(at &&) noexcept=default
const action_formula & operand() const
at(const at &) noexcept=default
Move semantics.
at(at &&) noexcept=default
at()
\brief Default constructor X3.
at & operator=(const at &) noexcept=default
at(const action_formula &operand, const data::data_expression &time_stamp)
\brief Constructor Z14.
\brief The existential quantification operator for action formulas
exists(const atermpp::aterm &term)
exists & operator=(exists &&) noexcept=default
exists(exists &&) noexcept=default
exists(const exists &) noexcept=default
Move semantics.
exists()
\brief Default constructor X3.
const data::variable_list & variables() const
exists & operator=(const exists &) noexcept=default
const action_formula & body() const
exists(const data::variable_list &variables, const action_formula &body)
\brief Constructor Z14.
\brief The value false for action formulas
false_(const atermpp::aterm &term)
false_()
\brief Default constructor X3.
false_(false_ &&) noexcept=default
false_(const false_ &) noexcept=default
Move semantics.
false_ & operator=(const false_ &) noexcept=default
false_ & operator=(false_ &&) noexcept=default
\brief The universal quantification operator for action formulas
forall & operator=(const forall &) noexcept=default
const action_formula & body() const
forall & operator=(forall &&) noexcept=default
forall(const atermpp::aterm &term)
const data::variable_list & variables() const
forall()
\brief Default constructor X3.
forall(const data::variable_list &variables, const action_formula &body)
\brief Constructor Z14.
forall(const forall &) noexcept=default
Move semantics.
forall(forall &&) noexcept=default
\brief The implication operator for action formulas
const action_formula & left() const
imp(const imp &) noexcept=default
Move semantics.
imp(imp &&) noexcept=default
imp & operator=(imp &&) noexcept=default
imp(const action_formula &left, const action_formula &right)
\brief Constructor Z14.
imp()
\brief Default constructor X3.
imp & operator=(const imp &) noexcept=default
imp(const atermpp::aterm &term)
const action_formula & right() const
\brief The multi action for action formulas
multi_action(const multi_action &) noexcept=default
Move semantics.
multi_action(multi_action &&) noexcept=default
multi_action(const process::action_list &actions)
\brief Constructor Z14.
multi_action(const atermpp::aterm &term)
multi_action & operator=(const multi_action &) noexcept=default
multi_action()
\brief Default constructor X3.
const process::action_list & actions() const
multi_action & operator=(multi_action &&) noexcept=default
\brief The not operator for action formulas
not_(const action_formula &operand)
\brief Constructor Z14.
not_()
\brief Default constructor X3.
const action_formula & operand() const
not_(const atermpp::aterm &term)
not_(not_ &&) noexcept=default
not_(const not_ &) noexcept=default
Move semantics.
not_ & operator=(const not_ &) noexcept=default
not_ & operator=(not_ &&) noexcept=default
\brief The or operator for action formulas
or_ & operator=(const or_ &) noexcept=default
or_(or_ &&) noexcept=default
or_()
\brief Default constructor X3.
or_ & operator=(or_ &&) noexcept=default
or_(const action_formula &left, const action_formula &right)
\brief Constructor Z14.
or_(const atermpp::aterm &term)
or_(const or_ &) noexcept=default
Move semantics.
const action_formula & right() const
const action_formula & left() const
\brief The value true for action formulas
true_(true_ &&) noexcept=default
true_ & operator=(const true_ &) noexcept=default
true_()
\brief Default constructor X3.
true_(const true_ &) noexcept=default
Move semantics.
true_(const atermpp::aterm &term)
true_ & operator=(true_ &&) noexcept=default
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.
data_expression(data_expression &&) noexcept=default
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
void add_sort(const basic_sort &s)
Adds a sort to this specification.
\brief A data variable
Definition variable.h:25
Action rename specification.
\brief A timed multi-action
multi_action(const multi_action &) noexcept=default
Move semantics.
const process::action_list & actions() const
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.
This class contains labels for probabilistic transistions, consisting of a numerator and a denumerato...
static probabilistic_data_expression one()
Constant one.
probabilistic_data_expression operator+(const probabilistic_data_expression &other) const
Standard addition operator. Note that the expression is not evaluated. For this the rewriter has to b...
probabilistic_data_expression(const data::data_expression &d)
Construct a probabilistic_data_expression from a data_expression, which must be of sort real.
bool operator==(const probabilistic_data_expression &other) const
probabilistic_data_expression(std::size_t enumerator, std::size_t denominator)
bool operator!=(const probabilistic_data_expression &other) const
bool operator>=(const probabilistic_data_expression &other) const
bool operator<(const probabilistic_data_expression &other) const
bool operator<=(const probabilistic_data_expression &other) const
bool operator>(const probabilistic_data_expression &other) const
probabilistic_data_expression(const std::string &enumerator, const std::string &denominator)
probabilistic_data_expression operator-(const probabilistic_data_expression &other) const
Standard subtraction operator.
static data::data_specification data_specification_with_real()
static probabilistic_data_expression zero()
Constant zero.
Linear process specification.
STATE & state()
Get the state in a state probability pair.
state_probability_pair(state_probability_pair &&p)=default
state_probability_pair & operator=(state_probability_pair &&p)=default
state_probability_pair(const state_probability_pair &p)=default
Copy constructor;.
state_probability_pair & operator=(const state_probability_pair &p)=default
Standard assignment.
const PROBABILITY & probability() const
get the probability from a state proability pair.
const STATE & state() const
Get the state from a state probability pair.
PROBABILITY & probability()
Set the probability in a state probability pair.
state_probability_pair(const STATE &state, const PROBABILITY &probability)
constructor.
bool operator==(const state_probability_pair &other) const
Standard equality operator.
A class containing the values for action labels for the .lts format.
Definition lts_lts.h:142
action_label_lts & operator=(const action_label_lts &)=default
Copy assignment.
void hide_actions(const std::vector< std::string > &tau_actions)
Hide the actions with labels in tau_actions.
Definition lts_lts.h:162
action_label_lts(const action_label_lts &)=default
Copy constructor.
static const action_label_lts & tau_action()
Definition lts_lts.h:178
action_label_lts(const mcrl2::lps::multi_action &a)
Constructor.
Definition lts_lts.h:155
action_label_lts()=default
Default constructor.
void set_truths(formula &f)
Compute and set the truth values of a formula f.
level_type gca_level(const block_index_type B1, const block_index_type B2)
Auxiliarry function that computes the level of the greatest common ancestor. In other words a lvl i s...
bisim_partitioner_minimal_depth(LTS_TYPE &l, const std::size_t init_l2)
Creates a bisimulation partitioner for an LTS.
mcrl2::state_formulas::state_formula dist_formula_mindepth(const std::size_t s, const std::size_t t)
Creates a state formula that distinguishes state s from state t.
formula distinguish(const block_index_type b1, const block_index_type b2)
Creates a formula that distinguishes a block b1 from the block b2.
~bisim_partitioner_minimal_depth()=default
Destroys this partitioner.
regular_formulas::regular_formula create_regular_formula(const mcrl2::lps::multi_action &a) const
create_regular_formula Creates a regular formula that represents action a
bool in_same_class(const std::size_t s, const std::size_t t)
block_index_type lift_block(const block_index_type B1, level_type goal)
mcrl2::state_formulas::state_formula conjunction(std::vector< formula > &conjunctions)
conjunction Creates a conjunction of state formulas
mcrl2::state_formulas::state_formula convert_formula(formula &f)
void split_BL(level_type lvl)
Performs the splits based on the blocks in Bsplit and the flags set in state_flags.
mcrl2::state_formulas::state_formula conjunction(std::set< mcrl2::state_formulas::state_formula > terms) const
conjunction Creates a conjunction of state formulas
regular_formulas::regular_formula create_regular_formula(const mcrl2::lts::action_label_string &a) const
create_regular_formula Creates a regular formula that represents action a
regular_formulas::regular_formula create_regular_formula(const mcrl2::lps::multi_action &a) const
create_regular_formula Creates a regular formula that represents action a
std::vector< bool > block_is_in_to_be_processed
std::map< block_index_type, block_index_type > right_child
std::vector< block_index_type > BL
bool in_same_class(const std::size_t s, const std::size_t t) const
Returns whether two states are in the same bisimulation equivalence class.
mcrl2::state_formulas::state_formula until_formula(const mcrl2::state_formulas::state_formula &phi1, const label_type &a, const mcrl2::state_formulas::state_formula &phi2)
until_formula Creates a state formula that corresponds to the until operator phi1phi2 from HMLU
std::size_t get_eq_class(const std::size_t s) const
Gives the bisimulation equivalence class number of a state.
bisim_partitioner(LTS_TYPE &l, const bool branching=false, const bool preserve_divergence=false, const bool generate_counter_examples=false)
Creates a bisimulation partitioner for an LTS.
~bisim_partitioner()=default
Destroys this partitioner.
std::map< block_index_type, label_type > split_by_action
std::size_t num_eq_classes() const
Gives the number of bisimulation equivalence classes of the LTS.
mcrl2::state_formulas::state_formula counter_formula(std::size_t s, std::size_t t)
Creates a state formula that distinguishes state s from state t.
void order_recursively_on_tau_reachability(const state_type s, std::map< state_type, std::vector< state_type > > &inert_transition_map, std::vector< non_bottom_state > &new_non_bottom_states, std::set< state_type > &visited)
std::vector< block_index_type > to_be_processed
std::map< block_index_type, block_index_type > split_by_block
void replace_transition_system(const bool branching, const bool preserve_divergences)
Replaces the transition relation of the current lts by the transitions of the bisimulation reduced tr...
void order_on_tau_reachability(std::vector< non_bottom_state > &non_bottom_states)
void split_the_blocks_in_BL(bool &partition_is_unstable, const label_type splitter_label, const block_index_type splitter_block)
void refine_partition_until_it_becomes_stable(const bool branching, const bool preserve_divergence)
void create_initial_partition(const bool branching, const bool preserve_divergences)
std::vector< state_type > block_index_of_a_state
mcrl2::state_formulas::state_formula counter_formula_aux(const block_index_type B1, const block_index_type B2)
void check_internal_consistency_of_the_partitioning_data_structure(const bool branching, const bool preserve_divergence) const
outgoing_transitions_per_state_action_t outgoing_transitions
function object to compare two constln_t pointers based on their contents
A class that can be used to store counterexample trees and.
lts_type type()
Provides the type of this lts, in casu lts_aut.
Definition lts_aut.h:39
bool operator==(const lts_aut_base &) const
Standard equality function.
Definition lts_aut.h:52
void swap(lts_aut_base &) noexcept
Standard swap function.
Definition lts_aut.h:45
void swap(lts_dot_base &) noexcept
The standard swap function.
Definition lts_dot.h:120
lts_type type() const
The lts_type of state_label_dot. In this case lts_dot.
Definition lts_dot.h:113
void clear()
Clear the transitions system.
Definition lts_fsm.h:134
const std::vector< std::string > & state_element_values(std::size_t idx) const
Provides the vector of strings that correspond to the values of the number at position idx in a vecto...
Definition lts_fsm.h:146
std::size_t add_state_element_value(std::size_t idx, const std::string &s)
Adds a string to the state element values for the idx-th position in a state vector....
Definition lts_fsm.h:178
void swap(lts_fsm_base &other) noexcept
Standard swap function.
Definition lts_fsm.h:123
bool operator==(const lts_fsm_base &other) const
Definition lts_fsm.h:108
lts_type type() const
The lts_type of this labelled transition system. In this case lts_fsm.
Definition lts_fsm.h:117
std::string state_element_value(std::size_t parameter_index, std::size_t element_index) const
Returns the element_index'th element for the parameter with index parameter_index.
Definition lts_fsm.h:193
std::string state_label_to_string(const state_label_fsm &l) const
Pretty print a state value of this FSM.
Definition lts_fsm.h:156
a base class for lts_lts_t and probabilistic_lts_t.
Definition lts_lts.h:267
static lts_type type()
Yields the type of this lts, in this case lts_lts.
Definition lts_lts.h:295
void set_process_parameters(const data::variable_list &params)
Set the state parameters for this LTS.
Definition lts_lts.h:353
lts_lts_base()=default
Default constructor.
bool operator==(const lts_lts_base &other) const
Standard equality function;.
Definition lts_lts.h:278
process::action_label_list m_action_decls
Definition lts_lts.h:271
void set_action_label_declarations(const process::action_label_list &decls)
Set the action label information for this LTS.
Definition lts_lts.h:317
const data::variable & process_parameter(std::size_t i) const
Returns the i-th parameter of the state vectors stored in this LTS.
Definition lts_lts.h:340
data::data_specification m_data_spec
Definition lts_lts.h:269
const data::variable_list & process_parameters() const
Return the process parameters stored in this LTS.
Definition lts_lts.h:332
void set_data(const data::data_specification &spec)
Set the mCRL2 data specification of this LTS.
Definition lts_lts.h:325
void swap(lts_lts_base &l) noexcept
Definition lts_lts.h:285
const process::action_label_list & action_label_declarations() const
Return action label declarations stored in this LTS.
Definition lts_lts.h:309
data::variable_list m_parameters
Definition lts_lts.h:270
A simple labelled transition format with only strings as action labels.
Definition lts_aut.h:67
void load(const std::string &filename)
Load the labelled transition system from a file.
void load(std::istream &is)
Load the labelled transition system from an input stream.
void save(const std::string &filename) const
Save the labelled transition system to file.
A class to contain labelled transition systems in graphviz format.
Definition lts_dot.h:132
void save(const std::string &filename) const
Save the labelled transition system to a file.
void save(std::ostream &os) const
Save the labelled transition system to a stream.
The class lts_fsm_t contains labelled transition systems in .fsm format.
Definition lts_fsm.h:254
void load(const std::string &filename)
Save the labelled transition system to file.
void save(const std::string &filename) const
Save the labelled transition system to file.
This class contains labelled transition systems in .lts format.
Definition lts_lts.h:369
lts_lts_t()=default
Creates an object containing no information.
void save(const std::string &filename) const
Save the labelled transition system to file.
void load(const std::string &filename)
Load the labelled transition system from file.
A simple labelled transition format with only strings as action labels.
Definition lts_aut.h:100
void load(const std::string &filename)
Load the labelled transition system from a file.
void load(std::istream &is)
Load the labelled transition system from an input stream.
void save(const std::string &filename) const
Save the labelled transition system to file.
A class to contain labelled transition systems in graphviz format.
Definition lts_dot.h:158
void save(std::ostream &os) const
Save the labelled transition system to a stream.
void save(const std::string &filename) const
Save the labelled transition system to a file.
The class lts_fsm_t contains labelled transition systems in .fsm format.
Definition lts_fsm.h:282
This class contains probabilistic labelled transition systems in .lts format.
Definition lts_lts.h:397
probabilistic_lts_lts_t()=default
Creates an object containing no information.
void load(const std::string &filename)
Load the labelled transition system from file.
void save(const std::string &filename) const
Save the labelled transition system to file.
A class that contains a labelled transition system.
probabilistic_lts(probabilistic_lts &&other)=default
Standard move constructor.
void set_initial_probabilistic_state(const PROBABILISTIC_STATE_T &state)
Sets the probabilistic initial state number of this LTS.
probabilistic_lts()=default
Creates an empty LTS.
const PROBABILISTIC_STATE_T & initial_probabilistic_state() const
Gets the initial state number of this LTS.
bool operator==(const probabilistic_lts &other) const
Standard equality operator.
labels_size_type num_probabilistic_states() const
Gets the number of probabilistic states of this LTS.
static constexpr bool is_probabilistic_lts
An indicator that this is a probabilistic lts.
void clear_probabilistic_states()
Clear the probabilistic states in this probabilistic transitions system.
states_size_type add_and_reset_probabilistic_state(PROBABILISTIC_STATE_T &s)
Adds a probabilistic state to this LTS and resets the state to empty.
void clear()
Clear the transitions system.
probabilistic_lts & operator=(probabilistic_lts &&other)=default
Standard assignment move operator.
void swap(probabilistic_lts &other) noexcept
Swap this lts with the supplied supplied LTS.
probabilistic_lts & operator=(const probabilistic_lts &other)=default
Standard assignment operator.
std::vector< PROBABILISTIC_STATE_T > m_probabilistic_states
probabilistic_lts(const probabilistic_lts &other)=default
Standard copy constructor.
states_size_type add_probabilistic_state(const PROBABILISTIC_STATE_T &s)
Adds a probabilistic state to this LTS.
states_size_type initial_state() const
PROBABILISTIC_STATE_T m_init_probabilistic_state
A class that contains a probabilistic state.
void set(const STATE &s)
Set this probabilistic state to a single state with probability one.
const_iterator begin() const
Gets an iterator over pairs of state and probability. This can only be used when the state is stored ...
void construct_internal_vector_representation()
Guarantee that this probabilistic state is internally stored as a vector, such that begin/end,...
probabilistic_state & operator=(const probabilistic_state &other)
Copy assignment constructor.
const_reverse_iterator rbegin() const
Gets a reverse iterator over pairs of state and probability. This can only be used when the state is ...
std::size_t size() const
Gets the number of probabilistic states in the vector representation of this state....
bool operator!=(const probabilistic_state &other) const
Standard equality operator.
iterator begin()
Gets an iterator over pairs of state and probability. This can only be used if the state is internall...
probabilistic_state & operator=(probabilistic_state &&other)=default
Move assignment operator.
STATE get() const
Get a probabilistic state if is is simple, i.e., consists of a single state.
void swap(probabilistic_state &other) noexcept
Swap this probabilistic state.
iterator end()
Gets the end iterator over pairs of state and probability.
reverse_iterator rbegin()
Gets a reverse iterator over pairs of state and probability. This can only be used if the state is in...
std::vector< state_probability_pair > m_probabilistic_state
const_iterator end() const
Gets the end iterator over pairs of state and probability.
reverse_iterator rend()
Gets the reverse end iterator over pairs of state and probability.
bool operator==(const probabilistic_state &other) const
Standard equality operator.
void clear()
Makes the probabilistic state empty.
probabilistic_state(probabilistic_state &&other)=default
Move constructor.
probabilistic_state(const STATE_PROBABILITY_PAIR_ITERATOR begin, const STATE_PROBABILITY_PAIR_ITERATOR end)
Creates a probabilistic state on the basis of state_probability_pairs.
STATE maximal_state() const
Provides the maximal state index in a probabilistic state.
probabilistic_state(const probabilistic_state &other)
Copy constructor.
void shrink_to_fit()
If a probabilistic state is ready, shrinking it to minimal size might be useful to reduce its memory ...
probabilistic_state()
Default constructor.
probabilistic_state(const STATE &s)
Constructor of a probabilistic state from a non probabilistic state.
void add(const STATE &s, const PROBABILITY &p)
Add a state with a probability to the probabilistic state.
const_reverse_iterator rend() const
Gets the reverse end iterator over pairs of state and probability.
Class for computing the signature for strong bisimulation.
Definition sigref.h:76
Class for computing the signature for branching bisimulation.
Definition sigref.h:106
Class for computing the signature for divergence preserving branching bisimulation.
Definition sigref.h:185
Signature based reductions for labelled transition systems.
Definition sigref.h:351
This class contains labels for states in dot format.
Definition lts_dot.h:34
void set_name(const std::string &s)
This method sets the name of the state label to the string s.
Definition lts_dot.h:53
std::string name() const
This method returns the string in the name field of a state label.
Definition lts_dot.h:60
std::string label() const
This method returns the label in the name field of a state label.
Definition lts_dot.h:74
void set_label(const std::string &s)
This method sets the label field of the state label to the string s.
Definition lts_dot.h:67
state_label_dot(const std::string &state_name, const std::string &state_label)
A constructor setting the name and label of this state label to the indicated values.
Definition lts_dot.h:47
std::string m_state_label
Definition lts_dot.h:37
bool operator==(const state_label_dot &l) const
Standard comparison operator, comparing both the string in the name field, as well as the one in the ...
Definition lts_dot.h:82
bool operator!=(const state_label_dot &l) const
Standard inequality operator. Just the negation of equality.
Definition lts_dot.h:89
state_label_dot()=default
The default constructor.
This class contains state labels for the fsm format.
Definition lts_fsm.h:36
state_label_fsm()=default
Default constructor. The label becomes an empty vector.
state_label_fsm(const state_label_fsm &)=default
Copy constructor.
state_label_fsm & operator=(const state_label_fsm &)=default
Copy assignment.
static state_label_fsm number_to_label(const std::size_t n)
Create a state label consisting of a number as the only list element.
Definition lts_fsm.h:67
state_label_fsm(const std::vector< std::size_t > &v)
Default constructor. The label is set to the vector v.
Definition lts_fsm.h:50
state_label_fsm operator+(const state_label_fsm &l) const
An operator to concatenate two state labels. Fsm labels cannot be concatenated. Therefore,...
Definition lts_fsm.h:56
This class contains state labels for an labelled transition system in .lts format.
Definition lts_lts.h:38
state_label_lts(const state_label_lts &)=default
Copy constructor.
state_label_lts operator+(const state_label_lts &l) const
An operator to concatenate two state labels.
Definition lts_lts.h:79
state_label_lts(const super &l)
Construct a state label out of list of balanced trees of data expressions, representing a state label...
Definition lts_lts.h:71
state_label_lts()=default
Default constructor.
state_label_lts(const lps::state &l)
Construct a state label out of a balanced tree of data expressions, representing a state label.
Definition lts_lts.h:64
state_label_lts & operator=(const state_label_lts &)=default
Copy assignment.
static state_label_lts number_to_label(const std::size_t n)
Create a state label consisting of a number as the only list element.
Definition lts_lts.h:94
state_label_lts(const CONTAINER &l)
Construct a single state label out of the elements in a container.
Definition lts_lts.h:55
Process specification consisting of a data specification, action labels, a sequence of process equati...
\brief An untyped multi action or data application
\brief The alt operator for regular formulas
alt(const atermpp::aterm &term)
alt()
\brief Default constructor X3.
alt & operator=(alt &&) noexcept=default
const regular_formula & right() const
alt(const regular_formula &left, const regular_formula &right)
\brief Constructor Z14.
alt(const alt &) noexcept=default
Move semantics.
alt(alt &&) noexcept=default
alt & operator=(const alt &) noexcept=default
const regular_formula & left() const
regular_formula()
\brief Default constructor X3.
regular_formula(const action_formulas::action_formula &x)
\brief Constructor Z6.
regular_formula(const atermpp::aterm &term)
regular_formula(const regular_formula &) noexcept=default
Move semantics.
regular_formula(const data::data_expression &x)
\brief Constructor Z6.
regular_formula & operator=(const regular_formula &) noexcept=default
regular_formula(regular_formula &&) noexcept=default
regular_formula & operator=(regular_formula &&) noexcept=default
\brief The seq operator for regular formulas
seq(const regular_formula &left, const regular_formula &right)
\brief Constructor Z14.
const regular_formula & right() const
seq & operator=(const seq &) noexcept=default
seq(const seq &) noexcept=default
Move semantics.
const regular_formula & left() const
seq(seq &&) noexcept=default
seq()
\brief Default constructor X3.
seq & operator=(seq &&) noexcept=default
seq(const atermpp::aterm &term)
\brief The 'trans or nil' operator for regular formulas
trans_or_nil & operator=(trans_or_nil &&) noexcept=default
trans_or_nil & operator=(const trans_or_nil &) noexcept=default
trans_or_nil(const trans_or_nil &) noexcept=default
Move semantics.
trans_or_nil(const regular_formula &operand)
\brief Constructor Z14.
trans_or_nil()
\brief Default constructor X3.
trans_or_nil(trans_or_nil &&) noexcept=default
trans_or_nil(const atermpp::aterm &term)
const regular_formula & operand() const
\brief The trans operator for regular formulas
trans(const atermpp::aterm &term)
trans(trans &&) noexcept=default
const regular_formula & operand() const
trans & operator=(const trans &) noexcept=default
trans & operator=(trans &&) noexcept=default
trans()
\brief Default constructor X3.
trans(const trans &) noexcept=default
Move semantics.
trans(const regular_formula &operand)
\brief Constructor Z14.
\brief An untyped regular formula or action formula
untyped_regular_formula()
\brief Default constructor X3.
untyped_regular_formula & operator=(untyped_regular_formula &&) noexcept=default
untyped_regular_formula & operator=(const untyped_regular_formula &) noexcept=default
untyped_regular_formula(const std::string &name, const regular_formula &left, const regular_formula &right)
\brief Constructor Z2.
untyped_regular_formula(const core::identifier_string &name, const regular_formula &left, const regular_formula &right)
\brief Constructor Z14.
const core::identifier_string & name() const
untyped_regular_formula(const untyped_regular_formula &) noexcept=default
Move semantics.
untyped_regular_formula(untyped_regular_formula &&) noexcept=default
\brief The and operator for state formulas
and_(and_ &&) noexcept=default
const state_formula & right() const
and_(const atermpp::aterm &term)
and_(const and_ &) noexcept=default
Move semantics.
and_(const state_formula &left, const state_formula &right)
\brief Constructor Z14.
and_ & operator=(const and_ &) noexcept=default
and_()
\brief Default constructor X3.
and_ & operator=(and_ &&) noexcept=default
const state_formula & left() const
\brief The multiply operator for state formulas with values
const_multiply_alt & operator=(const const_multiply_alt &) noexcept=default
const state_formula & left() const
const_multiply_alt(const state_formula &left, const data::data_expression &right)
\brief Constructor Z14.
const_multiply_alt(const const_multiply_alt &) noexcept=default
Move semantics.
const_multiply_alt(const_multiply_alt &&) noexcept=default
const data::data_expression & right() const
const_multiply_alt(const atermpp::aterm &term)
const_multiply_alt & operator=(const_multiply_alt &&) noexcept=default
const_multiply_alt()
\brief Default constructor X3.
\brief The multiply operator for state formulas with values
const data::data_expression & left() const
const_multiply(const const_multiply &) noexcept=default
Move semantics.
const_multiply(const data::data_expression &left, const state_formula &right)
\brief Constructor Z14.
const_multiply()
\brief Default constructor X3.
const_multiply(const_multiply &&) noexcept=default
const_multiply & operator=(const const_multiply &) noexcept=default
const_multiply & operator=(const_multiply &&) noexcept=default
const_multiply(const atermpp::aterm &term)
const state_formula & right() const
\brief The timed delay operator for state formulas
delay_timed(const atermpp::aterm &term)
delay_timed()
\brief Default constructor X3.
delay_timed & operator=(const delay_timed &) noexcept=default
const data::data_expression & time_stamp() const
delay_timed(const data::data_expression &time_stamp)
\brief Constructor Z14.
delay_timed(const delay_timed &) noexcept=default
Move semantics.
delay_timed(delay_timed &&) noexcept=default
delay_timed & operator=(delay_timed &&) noexcept=default
\brief The delay operator for state formulas
delay & operator=(delay &&) noexcept=default
delay()
\brief Default constructor X3.
delay(const delay &) noexcept=default
Move semantics.
delay(delay &&) noexcept=default
delay(const atermpp::aterm &term)
delay & operator=(const delay &) noexcept=default
\brief The existential quantification operator for state formulas
exists(const data::variable_list &variables, const state_formula &body)
\brief Constructor Z14.
const state_formula & body() const
exists(const exists &) noexcept=default
Move semantics.
exists(exists &&) noexcept=default
exists & operator=(const exists &) noexcept=default
exists & operator=(exists &&) noexcept=default
exists()
\brief Default constructor X3.
exists(const atermpp::aterm &term)
const data::variable_list & variables() const
\brief The value false for state formulas
false_(false_ &&) noexcept=default
false_ & operator=(const false_ &) noexcept=default
false_ & operator=(false_ &&) noexcept=default
false_(const atermpp::aterm &term)
false_(const false_ &) noexcept=default
Move semantics.
false_()
\brief Default constructor X3.
\brief The universal quantification operator for state formulas
const state_formula & body() const
forall(const atermpp::aterm &term)
const data::variable_list & variables() const
forall & operator=(const forall &) noexcept=default
forall & operator=(forall &&) noexcept=default
forall(const forall &) noexcept=default
Move semantics.
forall(const data::variable_list &variables, const state_formula &body)
\brief Constructor Z14.
forall(forall &&) noexcept=default
forall()
\brief Default constructor X3.
\brief The implication operator for state formulas
imp()
\brief Default constructor X3.
imp(imp &&) noexcept=default
imp(const state_formula &left, const state_formula &right)
\brief Constructor Z14.
imp & operator=(const imp &) noexcept=default
const state_formula & left() const
const state_formula & right() const
imp(const atermpp::aterm &term)
imp(const imp &) noexcept=default
Move semantics.
imp & operator=(imp &&) noexcept=default
\brief The infimum over a data type for state formulas
infimum(const infimum &) noexcept=default
Move semantics.
infimum()
\brief Default constructor X3.
infimum(const data::variable_list &variables, const state_formula &body)
\brief Constructor Z14.
infimum & operator=(infimum &&) noexcept=default
const data::variable_list & variables() const
const state_formula & body() const
infimum(const atermpp::aterm &term)
infimum(infimum &&) noexcept=default
infimum & operator=(const infimum &) noexcept=default
\brief The may operator for state formulas
const state_formula & operand() const
may()
\brief Default constructor X3.
const regular_formulas::regular_formula & formula() const
may & operator=(const may &) noexcept=default
may & operator=(may &&) noexcept=default
may(const regular_formulas::regular_formula &formula, const state_formula &operand)
\brief Constructor Z14.
may(may &&) noexcept=default
may(const atermpp::aterm &term)
may(const may &) noexcept=default
Move semantics.
\brief The minus operator for state formulas
minus & operator=(minus &&) noexcept=default
minus(minus &&) noexcept=default
minus(const minus &) noexcept=default
Move semantics.
minus(const atermpp::aterm &term)
minus(const state_formula &operand)
\brief Constructor Z14.
const state_formula & operand() const
minus & operator=(const minus &) noexcept=default
minus()
\brief Default constructor X3.
\brief The mu operator for state formulas
const core::identifier_string & name() const
const data::assignment_list & assignments() const
mu(const mu &) noexcept=default
Move semantics.
mu(const std::string &name, const data::assignment_list &assignments, const state_formula &operand)
\brief Constructor Z2.
mu(const core::identifier_string &name, const data::assignment_list &assignments, const state_formula &operand)
\brief Constructor Z14.
mu & operator=(const mu &) noexcept=default
mu(mu &&) noexcept=default
mu & operator=(mu &&) noexcept=default
mu(const atermpp::aterm &term)
mu()
\brief Default constructor X3.
const state_formula & operand() const
\brief The must operator for state formulas
must(must &&) noexcept=default
must & operator=(must &&) noexcept=default
must(const atermpp::aterm &term)
must(const regular_formulas::regular_formula &formula, const state_formula &operand)
\brief Constructor Z14.
const regular_formulas::regular_formula & formula() const
must(const must &) noexcept=default
Move semantics.
const state_formula & operand() const
must()
\brief Default constructor X3.
must & operator=(const must &) noexcept=default
\brief The not operator for state formulas
not_(not_ &&) noexcept=default
not_(const not_ &) noexcept=default
Move semantics.
not_ & operator=(const not_ &) noexcept=default
not_ & operator=(not_ &&) noexcept=default
not_()
\brief Default constructor X3.
not_(const atermpp::aterm &term)
const state_formula & operand() const
not_(const state_formula &operand)
\brief Constructor Z14.
\brief The nu operator for state formulas
nu(const atermpp::aterm &term)
nu(nu &&) noexcept=default
nu(const core::identifier_string &name, const data::assignment_list &assignments, const state_formula &operand)
\brief Constructor Z14.
nu()
\brief Default constructor X3.
nu & operator=(const nu &) noexcept=default
nu & operator=(nu &&) noexcept=default
const core::identifier_string & name() const
nu(const std::string &name, const data::assignment_list &assignments, const state_formula &operand)
\brief Constructor Z2.
const state_formula & operand() const
nu(const nu &) noexcept=default
Move semantics.
const data::assignment_list & assignments() const
\brief The or operator for state formulas
or_(or_ &&) noexcept=default
or_()
\brief Default constructor X3.
or_(const or_ &) noexcept=default
Move semantics.
or_(const state_formula &left, const state_formula &right)
\brief Constructor Z14.
or_ & operator=(const or_ &) noexcept=default
const state_formula & right() const
or_ & operator=(or_ &&) noexcept=default
or_(const atermpp::aterm &term)
const state_formula & left() const
\brief The plus operator for state formulas with values
plus & operator=(plus &&) noexcept=default
plus & operator=(const plus &) noexcept=default
plus(const plus &) noexcept=default
Move semantics.
const state_formula & left() const
plus(const atermpp::aterm &term)
plus()
\brief Default constructor X3.
const state_formula & right() const
plus(plus &&) noexcept=default
plus(const state_formula &left, const state_formula &right)
\brief Constructor Z14.
state_formula(const state_formula &) noexcept=default
Move semantics.
state_formula()
\brief Default constructor X3.
state_formula(state_formula &&) noexcept=default
bool has_time() const
Returns true if the formula is timed.
state_formula(const data::untyped_data_parameter &x)
\brief Constructor Z6.
state_formula & operator=(state_formula &&) noexcept=default
state_formula(const data::data_expression &x)
\brief Constructor Z6.
state_formula(const atermpp::aterm &term)
state_formula & operator=(const state_formula &) noexcept=default
\brief The sum over a data type for state formulas
sum(const sum &) noexcept=default
Move semantics.
sum(sum &&) noexcept=default
sum(const atermpp::aterm &term)
sum(const data::variable_list &variables, const state_formula &body)
\brief Constructor Z14.
sum & operator=(sum &&) noexcept=default
sum()
\brief Default constructor X3.
const data::variable_list & variables() const
const state_formula & body() const
sum & operator=(const sum &) noexcept=default
\brief The supremum over a data type for state formulas
supremum & operator=(supremum &&) noexcept=default
supremum(supremum &&) noexcept=default
supremum(const atermpp::aterm &term)
supremum()
\brief Default constructor X3.
supremum(const supremum &) noexcept=default
Move semantics.
supremum & operator=(const supremum &) noexcept=default
const state_formula & body() const
const data::variable_list & variables() const
supremum(const data::variable_list &variables, const state_formula &body)
\brief Constructor Z14.
\brief The value true for state formulas
true_()
\brief Default constructor X3.
true_ & operator=(const true_ &) noexcept=default
true_(true_ &&) noexcept=default
true_(const true_ &) noexcept=default
Move semantics.
true_(const atermpp::aterm &term)
true_ & operator=(true_ &&) noexcept=default
\brief The state formula variable
variable & operator=(const variable &) noexcept=default
variable(const core::identifier_string &name, const data::data_expression_list &arguments)
\brief Constructor Z14.
variable(const variable &) noexcept=default
Move semantics.
variable(const std::string &name, const data::data_expression_list &arguments)
\brief Constructor Z2.
variable()
\brief Default constructor X3.
variable & operator=(variable &&) noexcept=default
const core::identifier_string & name() const
const data::data_expression_list & arguments() const
variable(variable &&) noexcept=default
variable(const atermpp::aterm &term)
\brief The timed yaled operator for state formulas
yaled_timed(yaled_timed &&) noexcept=default
yaled_timed & operator=(const yaled_timed &) noexcept=default
yaled_timed()
\brief Default constructor X3.
yaled_timed & operator=(yaled_timed &&) noexcept=default
yaled_timed(const yaled_timed &) noexcept=default
Move semantics.
yaled_timed(const data::data_expression &time_stamp)
\brief Constructor Z14.
yaled_timed(const atermpp::aterm &term)
const data::data_expression & time_stamp() const
\brief The yaled operator for state formulas
yaled()
\brief Default constructor X3.
yaled(const atermpp::aterm &term)
yaled & operator=(const yaled &) noexcept=default
yaled(const yaled &) noexcept=default
Move semantics.
yaled(yaled &&) noexcept=default
yaled & operator=(yaled &&) noexcept=default
#define PRINT_SG_PL(counter, sg_string, pl_string)
#define PRINT_INT_PERCENTAGE(num, denom)
#define INIT_WITHOUT_BLC_SETS
#define min_above_pivot
#define abort_if_non_bottom_size_too_large_NewBotSt(i)
#define bottom_size(coroutine)
#define linked_list
#define new_start_bottom_states(idx)
#define new_end_bottom_states(idx)
#define abort_if_size_too_large(coroutine, i)
#define non_bottom_states_NewBotSt
#define new_end_bottom_states_NewBotSt
#define abort_if_bottom_size_too_large(coroutine)
#define max_below_pivot
#define bottom_and_non_bottom_size(coroutine)
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
Definition logger.h:435
std::string pp(const term_balanced_tree< Term > t)
bool is_aterm_balanced_tree(const aterm &t)
void make_term_balanced_tree(term_balanced_tree< Term > &result, ForwardTraversalIterator p, std::size_t size, Transformer transformer)
void make_exists(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(or_ &t1, or_ &t2) noexcept
\brief swap overload
std::string pp(const action_formulas::exists &x, bool arg0)
bool is_at(const atermpp::aterm &x)
void swap(forall &t1, forall &t2) noexcept
\brief swap overload
std::string pp(const action_formulas::imp &x, bool arg0)
void make_and(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const or_ &x)
std::string pp(const action_formulas::at &x, bool arg0)
std::ostream & operator<<(std::ostream &out, const action_formula &x)
std::string pp(const action_formulas::forall &x, bool arg0)
std::string pp(const action_formulas::or_ &x, bool arg0)
std::string pp(const action_formulas::action_formula &x, bool arg0)
std::ostream & operator<<(std::ostream &out, const true_ &x)
std::ostream & operator<<(std::ostream &out, const exists &x)
std::ostream & operator<<(std::ostream &out, const at &x)
std::string pp(const action_formulas::true_ &x, bool arg0)
std::set< data::variable > find_all_variables(const action_formulas::action_formula &x)
bool is_or(const atermpp::aterm &x)
void swap(action_formula &t1, action_formula &t2) noexcept
\brief swap overload
bool is_true(const atermpp::aterm &x)
bool is_forall(const atermpp::aterm &x)
void swap(not_ &t1, not_ &t2) noexcept
\brief swap overload
std::string pp(const action_formulas::not_ &x, bool arg0)
std::ostream & operator<<(std::ostream &out, const and_ &x)
void make_or(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(true_ &t1, true_ &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const false_ &x)
bool is_false(const atermpp::aterm &x)
bool is_not(const atermpp::aterm &x)
void swap(false_ &t1, false_ &t2) noexcept
\brief swap overload
void swap(and_ &t1, and_ &t2) noexcept
\brief swap overload
void make_imp(atermpp::aterm &t, const ARGUMENTS &... args)
bool is_imp(const atermpp::aterm &x)
bool is_and(const atermpp::aterm &x)
void make_forall(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(multi_action &t1, multi_action &t2) noexcept
\brief swap overload
void swap(imp &t1, imp &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const forall &x)
void swap(exists &t1, exists &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const imp &x)
std::ostream & operator<<(std::ostream &out, const multi_action &x)
void make_multi_action(atermpp::aterm &t, const ARGUMENTS &... args)
bool is_multi_action(const atermpp::aterm &x)
void make_not(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const not_ &x)
std::string pp(const action_formulas::multi_action &x, bool arg0)
void swap(at &t1, at &t2) noexcept
\brief swap overload
void make_at(atermpp::aterm &t, const ARGUMENTS &... args)
std::string pp(const action_formulas::false_ &x, bool arg0)
bool is_exists(const atermpp::aterm &x)
std::string pp(const action_formulas::and_ &x, bool arg0)
bool is_action_formula(const atermpp::aterm &x)
static data_specification const & default_specification()
Definition parse.h:28
Namespace for system defined sort bool_.
Definition bool.h:29
const function_symbol & false_()
Constructor for function symbol false.
Definition bool.h:106
const function_symbol & true_()
Constructor for function symbol true.
Definition bool.h:74
Namespace for system defined sort int_.
application cint(const data_expression &arg0)
Application of function symbol @cInt.
Definition int1.h:101
const basic_sort & int_()
Constructor for sort expression Int.
Definition int1.h:44
Namespace for system defined sort nat.
const basic_sort & nat()
Constructor for sort expression Nat.
Definition nat1.h:43
application cnat(const data_expression &arg0)
Application of function symbol @cNat.
Definition nat1.h:161
Namespace for system defined sort pos.
const function_symbol & c1()
Constructor for function symbol @c1.
Definition pos1.h:75
const basic_sort & pos()
Constructor for sort expression Pos.
Definition pos1.h:42
Namespace for system defined sort real_.
data_expression & real_one()
application creal(const data_expression &arg0, const data_expression &arg1)
Application of function symbol @cReal.
Definition real1.h:129
data_expression & real_zero()
const basic_sort & real_()
Constructor for sort expression Real.
Definition real1.h:45
application plus(const data_expression &arg0, const data_expression &arg1)
Application of function symbol +.
Definition real1.h:1112
application minus(const data_expression &arg0, const data_expression &arg1)
Application of function symbol -.
Definition real1.h:1197
bool is_data_expression(const atermpp::aterm &x)
Test for a data_expression expression.
application less(const data_expression &arg0, const data_expression &arg1)
Application of function symbol <.
Definition standard.h:263
bool is_untyped_data_parameter(const atermpp::aterm &x)
application equal_to(const data_expression &arg0, const data_expression &arg1)
Application of function symbol ==.
Definition standard.h:149
std::pair< std::set< data::variable >, std::set< data::variable > > read_write_parameters(const lps::action_summand &summand, const std::set< data::variable > &process_parameters)
Computes the read and written process parameters for the given summand.
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
multi_action complete_multi_action(process::untyped_multi_action &x, const process::action_label_list &action_decls, const data::data_specification &data_spec=data::detail::default_specification())
Definition lps.cpp:148
void remove_common_divisor(std::size_t &enumerator, std::size_t &denominator)
void complete_action_rename_specification(action_rename_specification &x, const lps::stochastic_specification &spec)
Definition lps.cpp:166
process::untyped_multi_action parse_multi_action_new(const std::string &text)
Definition lps.cpp:130
multi_action complete_multi_action(process::untyped_multi_action &x, multi_action_type_checker &typechecker, const data::data_specification &data_spec=data::detail::default_specification())
Definition lps.cpp:140
std::size_t greatest_common_divisor(std::size_t x, std::size_t y)
action_rename_specification parse_action_rename_specification_new(const std::string &text)
Definition lps.cpp:156
The main namespace for the LPS library.
Definition constelm.h:18
specification parse_linear_process_specification(const std::string &text)
Parses a linear process specification from a string.
Definition parse.h:149
void complete_data_specification(stochastic_specification &spec)
Adds all sorts that appear in the process of l to the data specification of l.
multi_action parse_multi_action(const std::string &text, const process::action_label_list &action_decls, const data::data_specification &data_spec=data::detail::default_specification())
Parses a multi_action from a string.
Definition parse.h:67
void parse_lps(std::istream &, Specification &)
Definition parse.h:156
process::action parse_action(const std::string &text, const process::action_label_list &action_decls, const data::data_specification &data_spec=data::detail::default_specification())
Parses an action from a string.
Definition parse.h:208
void complete_data_specification(specification &spec)
Adds all sorts that appear in the process of l to the data specification of l.
std::string pp(const probabilistic_data_expression &l)
multi_action parse_multi_action(std::stringstream &in, multi_action_type_checker &typechecker, const data::data_specification &data_spec=data::detail::default_specification())
Parses a multi_action from an input stream.
Definition parse.h:53
action_rename_specification parse_action_rename_specification(std::istream &in, const lps::stochastic_specification &spec)
Parses a process specification from an input stream.
Definition parse.h:91
std::ostream & operator<<(std::ostream &out, const probabilistic_data_expression &x)
Pretty print to an outstream.
multi_action parse_multi_action(std::stringstream &in, const process::action_label_list &action_decls, const data::data_specification &data_spec=data::detail::default_specification())
Parses a multi_action from an input stream.
Definition parse.h:39
action_rename_specification parse_action_rename_specification(const std::string &spec_string, const lps::stochastic_specification &spec)
Parses an action rename specification. Parses an action rename specification. If the action rename sp...
Definition parse.h:107
void parse_lps< specification >(std::istream &from, specification &result)
Definition parse.h:163
void make_state(state &result, ForwardTraversalIterator p, const std::size_t size)
Definition state.h:33
void parse_lps< stochastic_specification >(std::istream &from, stochastic_specification &result)
Parses a stochastic linear process specification from an input stream.
Definition parse.h:180
std::string pp(const lps::state &x)
Definition state.h:44
multi_action parse_multi_action(const std::string &text, multi_action_type_checker &typechecker, const data::data_specification &data_spec=data::detail::default_specification())
Parses a multi_action from a string.
Definition parse.h:80
void parse_lps(const std::string &text, Specification &result)
Definition parse.h:194
specification parse_linear_process_specification(std::istream &spec_stream)
Parses a linear process specification from an input stream.
Definition parse.h:125
void make_state(state &result, ForwardTraversalIterator p, const std::size_t size, Transformer transformer)
Definition state.h:24
bool bisimulation_compare(const LTS_TYPE &l1, const LTS_TYPE &l2, bool branching=false, bool preserve_divergences=false, bool generate_counter_examples=false, const std::string &counter_example_file="", bool structured_output=false)
Checks whether the two initial states of two lts's are strong or branching bisimilar.
lts_type guess_format(std::string const &s, const bool be_verbose)
Determines the LTS format from a filename by its extension.
Definition liblts.cpp:26
static const std::array< std::string, 5 > extension_strings
Definition liblts.cpp:73
std::string supported_lts_formats_text(const std::set< lts_type > &supported)
Gives a textual list describing supported LTS formats.
Definition liblts.cpp:185
bool destructive_bisimulation_compare_minimal_depth(LTS_TYPE &l1, LTS_TYPE &l2, const std::string &counter_example_file)
std::string string_for_type(const lts_type type)
Gives a string representation of an LTS format.
Definition liblts.cpp:112
void unmark_explicit_divergence_transitions(LTS_TYPE &l, const std::size_t divergent_transition_label)
std::string mime_type_for_type(const lts_type type)
Gives the MIME type associated with an LTS format.
Definition liblts.cpp:122
void get_trans(const outgoing_transitions_per_state_t &begin, tree_set_store &tss, std::ptrdiff_t d, std::vector< transition > &d_trans, LTS_TYPE &aut)
lts_type parse_format(std::string const &s)
Determines the LTS format from a format specification string.
Definition liblts.cpp:91
static const std::array< std::string, 5 > type_strings
Definition liblts.cpp:71
std::string extension_for_type(const lts_type type)
Gives the filename extension associated with an LTS format.
Definition liblts.cpp:117
LABEL_TYPE make_divergence_label(const std::string &s)
const std::set< lts_type > & supported_lts_formats()
Gives the set of all supported LTS formats.
Definition liblts.cpp:139
std::string lts_extensions_as_string(const std::set< lts_type > &supported)
Gives a list of extensions for supported LTS formats.
Definition liblts.cpp:221
std::string lts_extensions_as_string(const std::string &sep, const std::set< lts_type > &supported)
Gives a list of extensions for supported LTS formats.
Definition liblts.cpp:190
std::size_t mark_explicit_divergence_transitions(LTS_TYPE &l)
bool destructive_bisimulation_compare(LTS_TYPE &l1, LTS_TYPE &l2, bool branching=false, bool preserve_divergences=false, bool generate_counter_examples=false, const std::string &counter_example_file="", bool structured_output=false)
Checks whether the two initial states of two lts's are strong or branching bisimilar.
void bisimulation_reduce(LTS_TYPE &l, bool branching=false, bool preserve_divergences=false)
Reduce transition system l with respect to strong or (divergence preserving) branching bisimulation.
bool lts_named_cmp(const std::array< std::string, Size > &N, T a, T b)
Definition liblts.cpp:147
std::string supported_lts_formats_text(lts_type default_format, const std::set< lts_type > &supported)
Gives a textual list describing supported LTS formats.
Definition liblts.cpp:152
static const std::array< std::string, 5 > type_desc_strings
Definition liblts.cpp:75
static const std::array< std::string, 5 > mime_type_strings
Definition liblts.cpp:84
static const std::set< lts_type > & initialise_supported_lts_formats()
Definition liblts.cpp:127
bool destructive_compare(LTS_TYPE &l1, LTS_TYPE &l2, lts_preorder pre, bool generate_counter_example, const std::string &counter_example_file="", bool structured_output=false, lps::exploration_strategy strategy=lps::exploration_strategy::es_breadth, bool preprocess=true)
Checks whether this LTS is smaller than another LTS according to a preorder.
std::string pp(const state_label_dot &l)
Pretty print function for a state_label_dot. Only prints the label field.
Definition lts_dot.h:97
void check_lts(const LTS_TYPE &ltsspec)
Throws a runtime error if the LTS contains a transition with an invalid action label index.
std::set< process::action_label > find_action_labels(const LTS_TYPE &ltsspec)
Returns the action labels that occur in the transitions of the given LTS.
std::string pp(const state_label_lts &label)
Pretty print a state value of this LTS.
Definition lts_lts.h:106
bool is_deterministic(const LTS_TYPE &l)
Checks whether this LTS is deterministic.
outgoing_transitions_per_state_action_t transitions_per_outgoing_state_action_pair_reversed(const std::vector< transition > &trans)
Provide the transitions as a multimap accessible per from state and label, ordered backwardly.
action_label_lts parse_lts_action(const std::string &multi_action_string, const data::data_specification &data_spec, lps::multi_action_type_checker &typechecker)
Parse a string into an action label.
Definition lts_lts.h:200
void group_transitions_on_label(std::vector< transition > &transitions, std::function< std::size_t(const transition &)> get_label, const std::size_t number_of_labels, const std::size_t tau_label_index)
std::size_t to(const outgoing_pair_t &p)
Target state of a label state pair.
std::string pp(const state_label_fsm &label)
Pretty print an fsm state label.
Definition lts_fsm.h:75
outgoing_transitions_per_state_action_t transitions_per_outgoing_state_action_pair(const std::vector< transition > &trans)
Provide the transitions as a multimap accessible per from state and label.
void determinise(LTS_TYPE &l)
Determinises this LTS.
bool compare(const LTS_TYPE &l1, const LTS_TYPE &l2, lts_preorder pre, bool generate_counter_example, const std::string &counter_example_file="", bool structured_output=false, lps::exploration_strategy strategy=lps::exploration_strategy::es_breadth, bool preprocess=true)
Checks whether this LTS is smaller than another LTS according to a preorder.
std::string pp(const probabilistic_state< STATE, PROBABILITY > &l)
std::ostream & operator<<(std::ostream &out, const probabilistic_state< STATE, PROBABILITY > &l)
Pretty print to an outstream.
void reduce(LTS_TYPE &l, lts_equivalence eq)
Applies a reduction algorithm to this LTS.
bool compare(const LTS_TYPE &l1, const LTS_TYPE &l2, lts_equivalence eq, bool generate_counter_examples=false, const std::string &counter_example_file="", bool structured_output=false)
Checks whether this LTS is equivalent to another LTS.
outgoing_transitions_per_state_action_t transitions_per_outgoing_state_action_pair_reversed(const std::vector< transition > &trans, const std::set< transition::size_type > &hide_label_set)
Provide the transitions as a multimap accessible per from state and label, ordered backwardly.
bool destructive_compare(LTS_TYPE &l1, LTS_TYPE &l2, const lts_equivalence eq, const bool generate_counter_examples=false, const std::string &counter_example_file=std::string(), const bool structured_output=false)
Checks whether this LTS is equivalent to another LTS.
std::string pp(const action_label_lts &l)
Print the action label to string.
Definition lts_lts.h:187
outgoing_transitions_per_state_action_t transitions_per_outgoing_state_action_pair(const std::vector< transition > &trans, const std::set< transition::size_type > &hide_label_set)
Provide the transitions as a multimap accessible per from state and label.
void merge(LTS_TYPE &l1, const LTS_TYPE &l2)
Merge the second lts into the first lts.
bool reachability_check(lts< SL, AL, BASE > &l, bool remove_unreachable=false)
Checks whether all states in this LTS are reachable from the initial state and remove unreachable sta...
std::size_t label(const outgoing_pair_t &p)
Label of a pair of a label and target state.
std::size_t from(const outgoing_transitions_per_state_action_t::const_iterator &i)
From state of an iterator exploring transitions per outgoing state and action.
void group_transitions_on_label(const std::vector< transition >::iterator begin, const std::vector< transition >::iterator end, std::function< std::size_t(const transition &)> get_label, std::vector< std::pair< std::size_t, std::size_t > > &count_sum_transitions_per_action, const std::size_t tau_label_index=0, std::vector< std::size_t > &todo_stack=bogus_todo_stack)
bool reachability_check(probabilistic_lts< SL, AL, PROBABILISTIC_STATE, BASE > &l, bool remove_unreachable=false)
Checks whether all states in a probabilistic LTS are reachable from the initial state and remove unre...
void sort_transitions(std::vector< transition > &transitions, const std::set< transition::size_type > &hidden_label_set, transition_sort_style ts=transition_sort_style::src_lbl_tgt)
Sorts the transitions using a sort style.
The main namespace for the Process library.
bool is_linear(const process_specification &p, bool verbose=false)
Returns true if the process specification is linear.
Definition is_linear.h:344
bool is_untyped_multi_action(const atermpp::aterm &x)
void swap(trans &t1, trans &t2) noexcept
\brief swap overload
bool is_alt(const atermpp::aterm &x)
bool is_untyped_regular_formula(const atermpp::aterm &x)
void make_trans(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const regular_formula &x)
void make_seq(atermpp::aterm &t, const ARGUMENTS &... args)
void make_trans_or_nil(atermpp::aterm &t, const ARGUMENTS &... args)
bool is_trans(const atermpp::aterm &x)
std::string pp(const regular_formulas::trans &x, bool arg0)
void make_alt(atermpp::aterm &t, const ARGUMENTS &... args)
void make_untyped_regular_formula(atermpp::aterm &t, const ARGUMENTS &... args)
std::string pp(const regular_formulas::alt &x, bool arg0)
std::ostream & operator<<(std::ostream &out, const trans &x)
void swap(untyped_regular_formula &t1, untyped_regular_formula &t2) noexcept
\brief swap overload
bool is_trans_or_nil(const atermpp::aterm &x)
std::ostream & operator<<(std::ostream &out, const untyped_regular_formula &x)
bool is_regular_formula(const atermpp::aterm &x)
void swap(trans_or_nil &t1, trans_or_nil &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const trans_or_nil &x)
bool is_seq(const atermpp::aterm &x)
std::string pp(const regular_formulas::untyped_regular_formula &x, bool arg0)
std::string pp(const regular_formulas::seq &x, bool arg0)
std::string pp(const regular_formulas::trans_or_nil &x, bool arg0)
void swap(seq &t1, seq &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const seq &x)
void swap(regular_formula &t1, regular_formula &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const alt &x)
std::string pp(const regular_formulas::regular_formula &x, bool arg0)
void swap(alt &t1, alt &t2) noexcept
\brief swap overload
bool is_timed(const state_formula &x)
void swap(variable &t1, variable &t2) noexcept
\brief swap overload
bool is_infimum(const atermpp::aterm &x)
std::string pp(const state_formulas::nu &x, bool arg0)
std::string pp(const state_formulas::exists &x, bool arg0)
std::string pp(const state_formulas::not_ &x, bool arg0)
std::ostream & operator<<(std::ostream &out, const not_ &x)
bool is_and(const atermpp::aterm &x)
void swap(minus &t1, minus &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const sum &x)
std::string pp(const state_formulas::supremum &x, bool arg0)
bool is_delay_timed(const atermpp::aterm &x)
void swap(exists &t1, exists &t2) noexcept
\brief swap overload
bool is_const_multiply(const atermpp::aterm &x)
std::ostream & operator<<(std::ostream &out, const exists &x)
std::string pp(const state_formulas::must &x, bool arg0)
void swap(const_multiply_alt &t1, const_multiply_alt &t2) noexcept
\brief swap overload
void make_or(atermpp::aterm &t, const ARGUMENTS &... args)
bool is_minus(const atermpp::aterm &x)
void make_imp(atermpp::aterm &t, const ARGUMENTS &... args)
bool is_exists(const atermpp::aterm &x)
void swap(may &t1, may &t2) noexcept
\brief swap overload
void swap(mu &t1, mu &t2) noexcept
\brief swap overload
bool is_not(const atermpp::aterm &x)
std::string pp(const state_formulas::minus &x, bool arg0)
bool is_state_formula(const atermpp::aterm &x)
void swap(sum &t1, sum &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const const_multiply &x)
std::ostream & operator<<(std::ostream &out, const may &x)
void make_const_multiply(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const nu &x)
void make_exists(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(supremum &t1, supremum &t2) noexcept
\brief swap overload
bool is_supremum(const atermpp::aterm &x)
void swap(true_ &t1, true_ &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const minus &x)
bool is_must(const atermpp::aterm &x)
void swap(const_multiply &t1, const_multiply &t2) noexcept
\brief swap overload
std::set< data::variable > find_all_variables(const state_formulas::state_formula &x)
std::ostream & operator<<(std::ostream &out, const imp &x)
bool is_yaled(const atermpp::aterm &x)
std::ostream & operator<<(std::ostream &out, const mu &x)
std::ostream & operator<<(std::ostream &out, const must &x)
std::ostream & operator<<(std::ostream &out, const supremum &x)
void swap(not_ &t1, not_ &t2) noexcept
\brief swap overload
std::set< data::variable > find_free_variables(const state_formulas::state_formula &x)
void swap(state_formula &t1, state_formula &t2) noexcept
\brief swap overload
bool is_true(const atermpp::aterm &x)
std::string pp(const state_formulas::true_ &x, bool arg0)
void make_and(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const true_ &x)
std::string pp(const state_formulas::state_formula &x, bool arg0)
std::ostream & operator<<(std::ostream &out, const variable &x)
std::ostream & operator<<(std::ostream &out, const state_formula &x)
void swap(plus &t1, plus &t2) noexcept
\brief swap overload
std::string pp(const state_formulas::const_multiply &x, bool arg0)
void make_plus(atermpp::aterm &t, const ARGUMENTS &... args)
std::ostream & operator<<(std::ostream &out, const and_ &x)
std::string pp(const state_formulas::delay_timed &x, bool arg0)
void swap(yaled &t1, yaled &t2) noexcept
\brief swap overload
void swap(delay &t1, delay &t2) noexcept
\brief swap overload
bool is_variable(const atermpp::aterm &x)
std::ostream & operator<<(std::ostream &out, const forall &x)
void make_infimum(atermpp::aterm &t, const ARGUMENTS &... args)
bool is_may(const atermpp::aterm &x)
std::ostream & operator<<(std::ostream &out, const yaled_timed &x)
bool is_yaled_timed(const atermpp::aterm &x)
bool is_imp(const atermpp::aterm &x)
void swap(yaled_timed &t1, yaled_timed &t2) noexcept
\brief swap overload
void make_delay_timed(atermpp::aterm &t, const ARGUMENTS &... args)
std::string pp(const state_formulas::imp &x, bool arg0)
std::ostream & operator<<(std::ostream &out, const or_ &x)
std::string pp(const state_formulas::mu &x, bool arg0)
void make_const_multiply_alt(atermpp::aterm &t, const ARGUMENTS &... args)
void make_may(atermpp::aterm &t, const ARGUMENTS &... args)
bool is_sum(const atermpp::aterm &x)
state_formulas::state_formula translate_user_notation(const state_formulas::state_formula &x)
void make_must(atermpp::aterm &t, const ARGUMENTS &... args)
state_formulas::state_formula normalize_sorts(const state_formulas::state_formula &x, const data::sort_specification &sortspec)
void swap(and_ &t1, and_ &t2) noexcept
\brief swap overload
bool is_nu(const atermpp::aterm &x)
void swap(false_ &t1, false_ &t2) noexcept
\brief swap overload
std::string pp(const state_formulas::delay &x, bool arg0)
std::ostream & operator<<(std::ostream &out, const false_ &x)
std::string pp(const state_formulas::forall &x, bool arg0)
void swap(forall &t1, forall &t2) noexcept
\brief swap overload
std::string pp(const state_formulas::sum &x, bool arg0)
void swap(delay_timed &t1, delay_timed &t2) noexcept
\brief swap overload
void swap(infimum &t1, infimum &t2) noexcept
\brief swap overload
std::ostream & operator<<(std::ostream &out, const plus &x)
std::string pp(const state_formulas::yaled &x, bool arg0)
bool is_delay(const atermpp::aterm &x)
std::ostream & operator<<(std::ostream &out, const infimum &x)
std::string pp(const state_formulas::infimum &x, bool arg0)
std::string pp(const state_formulas::or_ &x, bool arg0)
std::ostream & operator<<(std::ostream &out, const delay &x)
std::string pp(const state_formulas::may &x, bool arg0)
bool is_false(const atermpp::aterm &x)
void make_variable(atermpp::aterm &t, const ARGUMENTS &... args)
void make_nu(atermpp::aterm &t, const ARGUMENTS &... args)
void make_supremum(atermpp::aterm &t, const ARGUMENTS &... args)
void make_sum(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(must &t1, must &t2) noexcept
\brief swap overload
bool is_plus(const atermpp::aterm &x)
std::ostream & operator<<(std::ostream &out, const delay_timed &x)
void make_not(atermpp::aterm &t, const ARGUMENTS &... args)
void swap(nu &t1, nu &t2) noexcept
\brief swap overload
std::string pp(const state_formulas::and_ &x, bool arg0)
void make_forall(atermpp::aterm &t, const ARGUMENTS &... args)
std::string pp(const state_formulas::false_ &x, bool arg0)
std::string pp(const state_formulas::const_multiply_alt &x, bool arg0)
bool is_mu(const atermpp::aterm &x)
bool is_forall(const atermpp::aterm &x)
void make_minus(atermpp::aterm &t, const ARGUMENTS &... args)
bool is_const_multiply_alt(const atermpp::aterm &x)
void swap(or_ &t1, or_ &t2) noexcept
\brief swap overload
std::string pp(const state_formulas::yaled_timed &x, bool arg0)
std::string pp(const state_formulas::plus &x, bool arg0)
bool is_or(const atermpp::aterm &x)
void make_yaled_timed(atermpp::aterm &t, const ARGUMENTS &... args)
std::string pp(const state_formulas::variable &x, bool arg0)
void swap(imp &t1, imp &t2) noexcept
\brief swap overload
std::set< data::sort_expression > find_sort_expressions(const state_formulas::state_formula &x)
bool find_nil(const state_formulas::state_formula &x)
std::ostream & operator<<(std::ostream &out, const const_multiply_alt &x)
std::set< process::action_label > find_action_labels(const state_formulas::state_formula &x)
std::ostream & operator<<(std::ostream &out, const yaled &x)
void make_mu(atermpp::aterm &t, const ARGUMENTS &... args)
std::set< core::identifier_string > find_identifiers(const state_formulas::state_formula &x)
void swap(atermpp::term_balanced_tree< T > &t1, atermpp::term_balanced_tree< T > &t2) noexcept
Swaps two balanced trees.
#define USE_SIMPLE_LIST
Definition simple_list.h:60
#define USE_POOL_ALLOCATOR
Definition simple_list.h:66
static const atermpp::aterm StateMay
static const atermpp::aterm StateOr
static const atermpp::aterm UntypedRegFrm
static const atermpp::aterm StateFrm
static const atermpp::aterm StateYaled
static const atermpp::aterm RegAlt
static const atermpp::aterm ActNot
static const atermpp::aterm ActImp
static const atermpp::aterm ActTrue
static const atermpp::aterm StateInfimum
static const atermpp::aterm StateAnd
static const atermpp::aterm StateExists
static const atermpp::aterm RegTrans
static const atermpp::aterm ActOr
static const atermpp::aterm StateConstantMultiplyAlt
static const atermpp::aterm ActFrm
static const atermpp::aterm ActForall
static const atermpp::aterm StateYaledTimed
static const atermpp::aterm ActFalse
static const atermpp::aterm StateFalse
static const atermpp::aterm RegFrm
static const atermpp::aterm StateDelay
static const atermpp::aterm StatePlus
static const atermpp::aterm StateMinus
static const atermpp::aterm StateNu
static const atermpp::aterm ActAnd
static const atermpp::aterm StateDelayTimed
static const atermpp::aterm StateSupremum
static const atermpp::aterm StateSum
static const atermpp::aterm ActAt
static const atermpp::aterm ActExists
static const atermpp::aterm StateMu
static const atermpp::aterm RegTransOrNil
static const atermpp::aterm StateVar
static const atermpp::aterm StateImp
static const atermpp::aterm RegSeq
static const atermpp::aterm StateTrue
static const atermpp::aterm StateForall
static const atermpp::aterm StateMust
static const atermpp::aterm StateNot
static const atermpp::aterm ActMultAct
static const atermpp::aterm StateConstantMultiply
std::vector< transition > non_inert_transitions
std::vector< non_bottom_state > non_bottom_states
non_bottom_state(const state_type s, const std::vector< state_type > &it)
Converts a process expression into linear process format. Use the convert member functions for this.
lps::specification convert(const process_specification &p)
Converts a process_specification into a specification. Throws non_linear_process if a non-linear sub-...
Converts a process expression into linear process format. Use the convert member functions for this.
lps::stochastic_specification convert(const process_specification &p)
Converts a process_specification into a stochastic_specification. Throws non_linear_process if a non-...
std::size_t operator()(const atermpp::term_balanced_tree< T > &t) const
std::size_t operator()(const mcrl2::lps::probabilistic_data_expression &p) const
std::size_t operator()(const mcrl2::lps::state_probability_pair< STATE, PROBABILITY > &p) const
std::size_t operator()(const mcrl2::lts::action_label_lts &as) const
Definition lts_lts.h:423
std::size_t operator()(const mcrl2::lts::probabilistic_state< STATE, PROBABILITY > &p) const