15#ifndef MCRL2_DATA_BAG1_H
16#define MCRL2_DATA_BAG1_H
19#include "mcrl2/utilities/exception.h"
20#include "mcrl2/data/basic_sort.h"
21#include "mcrl2/data/function_sort.h"
22#include "mcrl2/data/function_symbol.h"
23#include "mcrl2/data/application.h"
24#include "mcrl2/data/data_equation.h"
25#include "mcrl2/data/standard.h"
26#include "mcrl2/data/forall.h"
27#include "mcrl2/data/container_sort.h"
28#include "mcrl2/data/nat1.h"
29#include "mcrl2/data/fbag1.h"
30#include "mcrl2/data/fset1.h"
31#include "mcrl2/data/set1.h"
67 static core::identifier_string constructor_name = core::identifier_string(
"@bag");
68 return constructor_name;
89 return atermpp::down_cast<function_symbol>(e).name() == constructor_name();
123 return is_application(e) && is_constructor_function_symbol(atermpp::down_cast<application>(e).head());
131 function_symbol_vector result;
132 result.push_back(sort_bag::constructor(s));
142 function_symbol_vector result;
143 result.push_back(sort_bag::constructor(s));
155 implementation_map result;
164 static core::identifier_string bag_fbag_name = core::identifier_string(
"@bagfbag");
165 return bag_fbag_name;
186 return atermpp::down_cast<function_symbol>(e).name() == bag_fbag_name();
218 return is_application(e) && is_bag_fbag_function_symbol(atermpp::down_cast<application>(e).head());
226 static core::identifier_string bag_comprehension_name = core::identifier_string(
"@bagcomp");
227 return bag_comprehension_name;
237 return bag_comprehension;
248 return atermpp::down_cast<function_symbol>(e).name() == bag_comprehension_name();
280 return is_application(e) && is_bag_comprehension_function_symbol(atermpp::down_cast<application>(e).head());
288 static core::identifier_string count_name = core::identifier_string(
"count");
310 return f.name() == count_name() && atermpp::down_cast<function_sort>(f.sort()).domain().size() == 2;
344 return is_application(e) && is_count_function_symbol(atermpp::down_cast<application>(e).head());
352 static core::identifier_string in_name = core::identifier_string(
"in");
374 return f.name() == in_name() && atermpp::down_cast<function_sort>(f.sort()).domain().size() == 2;
408 return is_application(e) && is_in_function_symbol(atermpp::down_cast<application>(e).head());
416 static core::identifier_string union_name = core::identifier_string(
"+");
443 throw mcrl2::runtime_error(
"Cannot compute target sort for union_ with domain sorts " + pp(s0) +
", " + pp(s1) +
". ");
459 return f.name() == union_name() && atermpp::down_cast<function_sort>(f.sort()).domain().size() == 2;
493 return is_application(e) && is_union_function_symbol(atermpp::down_cast<application>(e).head());
501 static core::identifier_string intersection_name = core::identifier_string(
"*");
502 return intersection_name;
544 throw mcrl2::runtime_error(
"Cannot compute target sort for intersection with domain sorts " + pp(s0) +
", " + pp(s1) +
". ");
560 return f.name() == intersection_name() && atermpp::down_cast<function_sort>(f.sort()).domain().size() == 2;
594 return is_application(e) && is_intersection_function_symbol(atermpp::down_cast<application>(e).head());
602 static core::identifier_string difference_name = core::identifier_string(
"-");
603 return difference_name;
637 throw mcrl2::runtime_error(
"Cannot compute target sort for difference with domain sorts " + pp(s0) +
", " + pp(s1) +
". ");
653 return f.name() == difference_name() && atermpp::down_cast<function_sort>(f.sort()).domain().size() == 2;
687 return is_application(e) && is_difference_function_symbol(atermpp::down_cast<application>(e).head());
695 static core::identifier_string bag2set_name = core::identifier_string(
"Bag2Set");
717 return atermpp::down_cast<function_symbol>(e).name() == bag2set_name();
749 return is_application(e) && is_bag2set_function_symbol(atermpp::down_cast<application>(e).head());
757 static core::identifier_string set2bag_name = core::identifier_string(
"Set2Bag");
779 return atermpp::down_cast<function_symbol>(e).name() == set2bag_name();
811 return is_application(e) && is_set2bag_function_symbol(atermpp::down_cast<application>(e).head());
819 static core::identifier_string zero_function_name = core::identifier_string(
"@zero_");
820 return zero_function_name;
830 return zero_function;
841 return atermpp::down_cast<function_symbol>(e).name() == zero_function_name();
873 return is_application(e) && is_zero_function_function_symbol(atermpp::down_cast<application>(e).head());
881 static core::identifier_string one_function_name = core::identifier_string(
"@one_");
882 return one_function_name;
903 return atermpp::down_cast<function_symbol>(e).name() == one_function_name();
935 return is_application(e) && is_one_function_function_symbol(atermpp::down_cast<application>(e).head());
943 static core::identifier_string add_function_name = core::identifier_string(
"@add_");
944 return add_function_name;
965 return atermpp::down_cast<function_symbol>(e).name() == add_function_name();
999 return is_application(e) && is_add_function_function_symbol(atermpp::down_cast<application>(e).head());
1007 static core::identifier_string min_function_name = core::identifier_string(
"@min_");
1008 return min_function_name;
1018 return min_function;
1029 return atermpp::down_cast<function_symbol>(e).name() == min_function_name();
1063 return is_application(e) && is_min_function_function_symbol(atermpp::down_cast<application>(e).head());
1071 static core::identifier_string monus_function_name = core::identifier_string(
"@monus_");
1072 return monus_function_name;
1082 return monus_function;
1093 return atermpp::down_cast<function_symbol>(e).name() == monus_function_name();
1127 return is_application(e) && is_monus_function_function_symbol(atermpp::down_cast<application>(e).head());
1135 static core::identifier_string nat2bool_function_name = core::identifier_string(
"@Nat2Bool_");
1136 return nat2bool_function_name;
1146 return nat2bool_function;
1157 return atermpp::down_cast<function_symbol>(e).name() == nat2bool_function_name();
1189 return is_application(e) && is_nat2bool_function_function_symbol(atermpp::down_cast<application>(e).head());
1197 static core::identifier_string bool2nat_function_name = core::identifier_string(
"@Bool2Nat_");
1198 return bool2nat_function_name;
1208 return bool2nat_function;
1219 return atermpp::down_cast<function_symbol>(e).name() == bool2nat_function_name();
1251 return is_application(e) && is_bool2nat_function_function_symbol(atermpp::down_cast<application>(e).head());
1259 static core::identifier_string fbag_join_name = core::identifier_string(
"@fbag_join");
1260 return fbag_join_name;
1281 return atermpp::down_cast<function_symbol>(e).name() == fbag_join_name();
1319 return is_application(e) && is_fbag_join_function_symbol(atermpp::down_cast<application>(e).head());
1327 static core::identifier_string fbag_intersect_name = core::identifier_string(
"@fbag_inter");
1328 return fbag_intersect_name;
1338 return fbag_intersect;
1349 return atermpp::down_cast<function_symbol>(e).name() == fbag_intersect_name();
1387 return is_application(e) && is_fbag_intersect_function_symbol(atermpp::down_cast<application>(e).head());
1395 static core::identifier_string fbag_difference_name = core::identifier_string(
"@fbag_diff");
1396 return fbag_difference_name;
1406 return fbag_difference;
1417 return atermpp::down_cast<function_symbol>(e).name() == fbag_difference_name();
1455 return is_application(e) && is_fbag_difference_function_symbol(atermpp::down_cast<application>(e).head());
1463 static core::identifier_string fbag2fset_name = core::identifier_string(
"@fbag2fset");
1464 return fbag2fset_name;
1485 return atermpp::down_cast<function_symbol>(e).name() == fbag2fset_name();
1519 return is_application(e) && is_fbag2fset_function_symbol(atermpp::down_cast<application>(e).head());
1527 function_symbol_vector result;
1528 result.push_back(sort_bag::bag_fbag(s));
1529 result.push_back(sort_bag::bag_comprehension(s));
1530 result.push_back(sort_bag::count(s, s, bag(s)));
1531 result.push_back(sort_bag::in(s, s, bag(s)));
1532 result.push_back(sort_bag::union_(s, bag(s), bag(s)));
1533 result.push_back(sort_bag::intersection(s, bag(s), bag(s)));
1534 result.push_back(sort_bag::intersection(s, sort_fbag::fbag(s), bag(s)));
1535 result.push_back(sort_bag::intersection(s, bag(s), sort_fbag::fbag(s)));
1536 result.push_back(sort_bag::difference(s, bag(s), bag(s)));
1537 result.push_back(sort_bag::difference(s, sort_fbag::fbag(s), bag(s)));
1538 result.push_back(sort_bag::bag2set(s));
1539 result.push_back(sort_bag::set2bag(s));
1540 result.push_back(sort_bag::zero_function(s));
1541 result.push_back(sort_bag::one_function(s));
1542 result.push_back(sort_bag::add_function(s));
1543 result.push_back(sort_bag::min_function(s));
1544 result.push_back(sort_bag::monus_function(s));
1545 result.push_back(sort_bag::nat2bool_function(s));
1546 result.push_back(sort_bag::bool2nat_function(s));
1547 result.push_back(sort_bag::fbag_join(s));
1548 result.push_back(sort_bag::fbag_intersect(s));
1549 result.push_back(sort_bag::fbag_difference(s));
1550 result.push_back(sort_bag::fbag2fset(s));
1560 function_symbol_vector result=bag_generate_functions_code(s);
1561 for(
const function_symbol& f: bag_generate_constructors_code(s))
1563 result.push_back(f);
1574 function_symbol_vector result;
1575 result.push_back(sort_bag::bag_fbag(s));
1576 result.push_back(sort_bag::bag_comprehension(s));
1577 result.push_back(sort_bag::count(s, s, bag(s)));
1578 result.push_back(sort_bag::in(s, s, bag(s)));
1579 result.push_back(sort_bag::union_(s, bag(s), bag(s)));
1580 result.push_back(sort_bag::intersection(s, bag(s), bag(s)));
1581 result.push_back(sort_bag::intersection(s, sort_fbag::fbag(s), bag(s)));
1582 result.push_back(sort_bag::intersection(s, bag(s), sort_fbag::fbag(s)));
1583 result.push_back(sort_bag::difference(s, bag(s), bag(s)));
1584 result.push_back(sort_bag::difference(s, sort_fbag::fbag(s), bag(s)));
1585 result.push_back(sort_bag::bag2set(s));
1586 result.push_back(sort_bag::set2bag(s));
1587 result.push_back(sort_bag::zero_function(s));
1588 result.push_back(sort_bag::one_function(s));
1589 result.push_back(sort_bag::add_function(s));
1590 result.push_back(sort_bag::min_function(s));
1591 result.push_back(sort_bag::monus_function(s));
1592 result.push_back(sort_bag::nat2bool_function(s));
1593 result.push_back(sort_bag::bool2nat_function(s));
1594 result.push_back(sort_bag::fbag_join(s));
1595 result.push_back(sort_bag::fbag_intersect(s));
1596 result.push_back(sort_bag::fbag_difference(s));
1597 result.push_back(sort_bag::fbag2fset(s));
1610 implementation_map result;
1622 return atermpp::down_cast<application>(e)[0];
1634 return atermpp::down_cast<application>(e)[1];
1646 return atermpp::down_cast<application>(e)[0];
1658 return atermpp::down_cast<application>(e)[0];
1670 return atermpp::down_cast<application>(e)[1];
1682 return atermpp::down_cast<application>(e)[2];
1694 return atermpp::down_cast<application>(e)[3];
1718 data_equation_vector result;
1719 result.emplace_back(variable_list({vb}), bag_fbag(s, vb), constructor(s, zero_function(s), vb));
1720 result.emplace_back(variable_list({vf}), sort_bag::bag_comprehension(s, vf), constructor(s, vf, sort_fbag::empty(s)));
1721 result.emplace_back(variable_list({vb, ve, vf}), count(s, ve, constructor(s, vf, vb)), sort_nat::swap_zero(vf(ve), count(s, ve, vb)));
1722 result.emplace_back(variable_list({ve, vx}), in(s, ve, vx), greater(count(s, ve, vx), sort_nat::c0()));
1723 result.emplace_back(variable_list({vb, vc, vf, vg}), equal_to(constructor(s, vf, vb), constructor(s, vg, vc)), if_(equal_to(vf, vg), equal_to(vb, vc), forall(variable_list({vd}), equal_to(count(s, vd, constructor(s, vf, vb)), count(s, vd, constructor(s, vg, vc))))));
1724 result.emplace_back(variable_list({vx, vy}), less(vx, vy), sort_bool::and_(less_equal(vx, vy), not_equal_to(vx, vy)));
1725 result.emplace_back(variable_list({vx, vy}), less_equal(vx, vy), equal_to(intersection(s, vx, vy), vx));
1726 result.emplace_back(variable_list({vb, vc, vf, vg}), less_total(constructor(s, vf, vb), constructor(s, vg, vc)), sort_bool::or_(less_total(vb, vc), sort_bool::and_(equal_to(vb, vc), less_total(vf, vg))));
1727 result.emplace_back(variable_list({vb, vc, vf, vg}), union_(s, constructor(s, vf, vb), constructor(s, vg, vc)), constructor(s, add_function(s, vf, vg), fbag_join(s, vf, vg, vb, vc)));
1728 result.emplace_back(variable_list({vx}), intersection(s, vx, vx), vx);
1729 result.emplace_back(variable_list({vx, vy}), intersection(s, vx, intersection(s, vx, vy)), intersection(s, vx, vy));
1730 result.emplace_back(variable_list({vx, vy}), intersection(s, vx, intersection(s, vy, vx)), intersection(s, vy, vx));
1731 result.emplace_back(variable_list({vx, vy}), intersection(s, intersection(s, vx, vy), vx), intersection(s, vx, vy));
1732 result.emplace_back(variable_list({vx, vy}), intersection(s, intersection(s, vy, vx), vx), intersection(s, vy, vx));
1733 result.emplace_back(variable_list({vb, vc, vf, vg}), intersection(s, constructor(s, vf, vb), constructor(s, vg, vc)), constructor(s, min_function(s, vf, vg), fbag_intersect(s, vf, vg, vb, vc)));
1734 result.emplace_back(variable_list({vx}), intersection(s, sort_fbag::empty(s), vx), sort_fbag::empty(s));
1735 result.emplace_back(variable_list({vb, vd, vp, vx}), intersection(s, sort_fbag::cons_(s, vd, vp, vb), vx), if_(in(s, vd, vx), sort_fbag::cons_(s, vd, sort_nat::minimum(vp, sort_nat::nat2pos(count(s, vd, vx))), intersection(s, vb, vx)), intersection(s, vb, vx)));
1736 result.emplace_back(variable_list({vb, vx}), intersection(s, vx, vb), intersection(s, vb, vx));
1737 result.emplace_back(variable_list({vb, vc, vf, vg}), difference(s, constructor(s, vf, vb), constructor(s, vg, vc)), constructor(s, monus_function(s, vf, vg), fbag_difference(s, vf, vg, vb, vc)));
1738 result.emplace_back(variable_list({vx}), difference(s, sort_fbag::empty(s), vx), sort_fbag::empty(s));
1739 result.emplace_back(variable_list({vb, vd, vp, vx}), difference(s, sort_fbag::cons_(s, vd, vp, vb), vx), if_(greater(sort_nat::pos2nat(vp), count(s, vd, vx)), sort_fbag::cons_(s, vd, sort_nat::nat2pos(sort_nat::monus(sort_nat::pos2nat(vp), count(s, vd, vx))), difference(s, vb, vx)), difference(s, vb, vx)));
1740 result.emplace_back(variable_list({vb, vf}), bag2set(s, constructor(s, vf, vb)), sort_set::constructor(s, nat2bool_function(s, vf), fbag2fset(s, vf, vb)));
1741 result.emplace_back(variable_list({vh, vs}), set2bag(s, sort_set::constructor(s, vh, vs)), constructor(s, bool2nat_function(s, vh), sort_fbag::fset2fbag(s, vs)));
1742 result.emplace_back(variable_list({ve}), zero_function(s, ve), sort_nat::c0());
1743 result.emplace_back(variable_list({ve}), one_function(s, ve), sort_nat::cnat(sort_pos::c1()));
1744 result.emplace_back(variable_list(), equal_to(zero_function(s), one_function(s)), sort_bool::false_());
1745 result.emplace_back(variable_list(), equal_to(one_function(s), zero_function(s)), sort_bool::false_());
1746 result.emplace_back(variable_list({ve, vf, vg}), add_function(s, vf, vg)(ve), sort_nat::plus(vf(ve), vg(ve)));
1747 result.emplace_back(variable_list({vf}), add_function(s, vf, zero_function(s)), vf);
1748 result.emplace_back(variable_list({vf}), add_function(s, zero_function(s), vf), vf);
1749 result.emplace_back(variable_list({ve, vf, vg}), min_function(s, vf, vg)(ve), sort_nat::minimum(vf(ve), vg(ve)));
1750 result.emplace_back(variable_list({vf}), min_function(s, vf, vf), vf);
1751 result.emplace_back(variable_list({vf}), min_function(s, vf, zero_function(s)), zero_function(s));
1752 result.emplace_back(variable_list({vf}), min_function(s, zero_function(s), vf), zero_function(s));
1753 result.emplace_back(variable_list({ve, vf, vg}), monus_function(s, vf, vg)(ve), sort_nat::monus(vf(ve), vg(ve)));
1754 result.emplace_back(variable_list({vf}), monus_function(s, vf, vf), zero_function(s));
1755 result.emplace_back(variable_list({vf}), monus_function(s, vf, zero_function(s)), vf);
1756 result.emplace_back(variable_list({vf}), monus_function(s, zero_function(s), vf), zero_function(s));
1757 result.emplace_back(variable_list({ve, vf}), nat2bool_function(s, vf)(ve), greater(vf(ve), sort_nat::c0()));
1758 result.emplace_back(variable_list(), nat2bool_function(s, zero_function(s)), sort_set::false_function(s));
1759 result.emplace_back(variable_list(), nat2bool_function(s, one_function(s)), sort_set::true_function(s));
1760 result.emplace_back(variable_list({ve, vh}), bool2nat_function(s, vh)(ve), if_(vh(ve), sort_nat::cnat(sort_pos::c1()), sort_nat::c0()));
1761 result.emplace_back(variable_list(), bool2nat_function(s, sort_set::false_function(s)), zero_function(s));
1762 result.emplace_back(variable_list(), bool2nat_function(s, sort_set::true_function(s)), one_function(s));
1763 result.emplace_back(variable_list({vw, vz}), fbag_join(s, zero_function(s), zero_function(s), vw, vz), union_(s, vw, vz));
1764 result.emplace_back(variable_list({vf, vg}), fbag_join(s, vf, vg, sort_fbag::empty(s), sort_fbag::empty(s)), sort_fbag::empty(s));
1765 result.emplace_back(variable_list({vb, vd, vf, vg, vp}), fbag_join(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), sort_fbag::empty(s)), sort_fbag::cinsert(s, vd, sort_nat::swap_zero_add(vf(vd), vg(vd), sort_nat::cnat(vp), sort_nat::c0()), fbag_join(s, vf, vg, vb, sort_fbag::empty(s))));
1766 result.emplace_back(variable_list({vc, ve, vf, vg, vq}), fbag_join(s, vf, vg, sort_fbag::empty(s), sort_fbag::cons_(s, ve, vq, vc)), sort_fbag::cinsert(s, ve, sort_nat::swap_zero_add(vf(ve), vg(ve), sort_nat::c0(), sort_nat::cnat(vq)), fbag_join(s, vf, vg, sort_fbag::empty(s), vc)));
1767 result.emplace_back(variable_list({vb, vc, vd, vf, vg, vp, vq}), fbag_join(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), sort_fbag::cons_(s, vd, vq, vc)), sort_fbag::cinsert(s, vd, sort_nat::swap_zero_add(vf(vd), vg(vd), sort_nat::cnat(vp), sort_nat::cnat(vq)), fbag_join(s, vf, vg, vb, vc)));
1768 result.emplace_back(variable_list({vb, vc, vd, ve, vf, vg, vp, vq}), less_total(vd, ve), fbag_join(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), sort_fbag::cons_(s, ve, vq, vc)), sort_fbag::cinsert(s, vd, sort_nat::swap_zero_add(vf(vd), vg(vd), sort_nat::cnat(vp), sort_nat::c0()), fbag_join(s, vf, vg, vb, sort_fbag::cons_(s, ve, vq, vc))));
1769 result.emplace_back(variable_list({vb, vc, vd, ve, vf, vg, vp, vq}), less_total(ve, vd), fbag_join(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), sort_fbag::cons_(s, ve, vq, vc)), sort_fbag::cinsert(s, ve, sort_nat::swap_zero_add(vf(ve), vg(ve), sort_nat::c0(), sort_nat::cnat(vq)), fbag_join(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), vc)));
1770 result.emplace_back(variable_list({vf, vg}), fbag_intersect(s, vf, vg, sort_fbag::empty(s), sort_fbag::empty(s)), sort_fbag::empty(s));
1771 result.emplace_back(variable_list({vb, vd, vf, vg, vp}), fbag_intersect(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), sort_fbag::empty(s)), sort_fbag::cinsert(s, vd, sort_nat::swap_zero_min(vf(vd), vg(vd), sort_nat::cnat(vp), sort_nat::c0()), fbag_intersect(s, vf, vg, vb, sort_fbag::empty(s))));
1772 result.emplace_back(variable_list({vc, ve, vf, vg, vq}), fbag_intersect(s, vf, vg, sort_fbag::empty(s), sort_fbag::cons_(s, ve, vq, vc)), sort_fbag::cinsert(s, ve, sort_nat::swap_zero_min(vf(ve), vg(ve), sort_nat::c0(), sort_nat::cnat(vq)), fbag_intersect(s, vf, vg, sort_fbag::empty(s), vc)));
1773 result.emplace_back(variable_list({vb, vc, vd, vf, vg, vp, vq}), fbag_intersect(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), sort_fbag::cons_(s, vd, vq, vc)), sort_fbag::cinsert(s, vd, sort_nat::swap_zero_min(vf(vd), vg(vd), sort_nat::cnat(vp), sort_nat::cnat(vq)), fbag_intersect(s, vf, vg, vb, vc)));
1774 result.emplace_back(variable_list({vb, vc, vd, ve, vf, vg, vp, vq}), less_total(vd, ve), fbag_intersect(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), sort_fbag::cons_(s, ve, vq, vc)), sort_fbag::cinsert(s, vd, sort_nat::swap_zero_min(vf(vd), vg(vd), sort_nat::cnat(vp), sort_nat::c0()), fbag_intersect(s, vf, vg, vb, sort_fbag::cons_(s, ve, vq, vc))));
1775 result.emplace_back(variable_list({vb, vc, vd, ve, vf, vg, vp, vq}), less_total(ve, vd), fbag_intersect(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), sort_fbag::cons_(s, ve, vq, vc)), sort_fbag::cinsert(s, ve, sort_nat::swap_zero_min(vf(ve), vg(ve), sort_nat::c0(), sort_nat::cnat(vq)), fbag_intersect(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), vc)));
1776 result.emplace_back(variable_list({vf, vg}), fbag_difference(s, vf, vg, sort_fbag::empty(s), sort_fbag::empty(s)), sort_fbag::empty(s));
1777 result.emplace_back(variable_list({vb, vd, vf, vg, vp}), fbag_difference(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), sort_fbag::empty(s)), sort_fbag::cinsert(s, vd, sort_nat::swap_zero_monus(vf(vd), vg(vd), sort_nat::cnat(vp), sort_nat::c0()), fbag_difference(s, vf, vg, vb, sort_fbag::empty(s))));
1778 result.emplace_back(variable_list({vc, ve, vf, vg, vq}), fbag_difference(s, vf, vg, sort_fbag::empty(s), sort_fbag::cons_(s, ve, vq, vc)), sort_fbag::cinsert(s, ve, sort_nat::swap_zero_monus(vf(ve), vg(ve), sort_nat::c0(), sort_nat::cnat(vq)), fbag_difference(s, vf, vg, sort_fbag::empty(s), vc)));
1779 result.emplace_back(variable_list({vb, vc, vd, vf, vg, vp, vq}), fbag_difference(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), sort_fbag::cons_(s, vd, vq, vc)), sort_fbag::cinsert(s, vd, sort_nat::swap_zero_monus(vf(vd), vg(vd), sort_nat::cnat(vp), sort_nat::cnat(vq)), fbag_difference(s, vf, vg, vb, vc)));
1780 result.emplace_back(variable_list({vb, vc, vd, ve, vf, vg, vp, vq}), less_total(vd, ve), fbag_difference(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), sort_fbag::cons_(s, ve, vq, vc)), sort_fbag::cinsert(s, vd, sort_nat::swap_zero_monus(vf(vd), vg(vd), sort_nat::cnat(vp), sort_nat::c0()), fbag_difference(s, vf, vg, vb, sort_fbag::cons_(s, ve, vq, vc))));
1781 result.emplace_back(variable_list({vb, vc, vd, ve, vf, vg, vp, vq}), less_total(ve, vd), fbag_difference(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), sort_fbag::cons_(s, ve, vq, vc)), sort_fbag::cinsert(s, ve, sort_nat::swap_zero_monus(vf(ve), vg(ve), sort_nat::c0(), sort_nat::cnat(vq)), fbag_difference(s, vf, vg, sort_fbag::cons_(s, vd, vp, vb), vc)));
1782 result.emplace_back(variable_list({vf}), fbag2fset(s, vf, sort_fbag::empty(s)), sort_fset::empty(s));
1783 result.emplace_back(variable_list({vb, vd, vf, vp}), fbag2fset(s, vf, sort_fbag::cons_(s, vd, vp, vb)), sort_fset::cinsert(s, vd, equal_to(equal_to(vf(vd), sort_nat::cnat(vp)), greater(vf(vd), sort_nat::c0())), fbag2fset(s, vf, vb)));
aterm(const aterm &other) noexcept=default
This class has user-declared copy constructor so declare default copy and move operators.
A unordered_map class in which aterms can be stored.
apply_builder_arg1(const Arg1 &arg1)
apply_builder_arg2(const Arg1 &arg1, const Arg2 &arg2)
update_apply_builder_arg1(const Function &f, const Arg1 &arg1)
void apply(T &result, const argument_type &x)
An abstraction expression.
const variable_list & variables() const
const data_expression & body() const
alias()
\brief Default constructor X3.
alias(const alias &) noexcept=default
Move semantics.
alias & operator=(const alias &) noexcept=default
alias(const basic_sort &name, const sort_expression &reference)
\brief Constructor Z12.
alias(alias &&) noexcept=default
alias(const atermpp::aterm &term)
alias & operator=(alias &&) noexcept=default
const basic_sort & name() const
const sort_expression & reference() const
\brief Assignment expression
\brief Assignment of a data expression to a variable
const data_expression & rhs() const
const variable & lhs() const
universal quantification.
\brief Container type for bags
bag_container()
\brief Default constructor X3.
basic_sort(const basic_sort &) noexcept=default
Move semantics.
basic_sort()
\brief Default constructor X3.
basic_sort & operator=(const basic_sort &) noexcept=default
const core::identifier_string & name() const
basic_sort(basic_sort &&) noexcept=default
basic_sort(const core::identifier_string &name)
\brief Constructor Z14.
basic_sort(const std::string &name)
\brief Constructor Z2.
basic_sort & operator=(basic_sort &&) noexcept=default
basic_sort(const atermpp::aterm &term)
container_sort(const container_type &container_name, const sort_expression &element_sort)
\brief Constructor Z14.
const container_type & container_name() const
const sort_expression & element_sort() const
container_sort(const atermpp::aterm &term)
const data_expression & lhs() const
const data_expression & condition() const
const data_expression & rhs() const
const variable_list & variables() const
application operator()(const data_expression &e1, const data_expression &e2, const data_expression &e3, const data_expression &e4) const
Apply a data expression to four data expressions.
application operator()(const data_expression &e1, const data_expression &e2) const
Apply a data expression to two data expressions.
sort_expression sort() const
Returns the sort of the data expression.
application operator()(const data_expression &e) const
Apply a data expression to a data expression.
existential quantification.
universal quantification.
const sort_expression & codomain() const
const sort_expression_list & domain() const
function_symbol(const core::identifier_string &name, const sort_expression &sort)
Constructor.
const core::identifier_string & name() const
const sort_expression & sort() const
universal quantification.
sort_expression & operator=(const sort_expression &) noexcept=default
sort_expression(const sort_expression &) noexcept=default
Move semantics.
sort_expression & operator=(sort_expression &&) noexcept=default
const sort_expression & target_sort() const
Returns the target sort of this expression.
sort_expression(sort_expression &&) noexcept=default
sort_expression()
\brief Default constructor X3.
sort_expression(const atermpp::aterm &term)
\brief An argument of a constructor of a structured sort
const core::identifier_string & name() const
const sort_expression & sort() const
\brief A constructor for a structured sort
const core::identifier_string & name() const
const core::identifier_string & recogniser() const
const structured_sort_constructor_argument_list & arguments() const
const structured_sort_constructor_list & constructors() const
\brief An untyped parameter
const core::identifier_string & name() const
const data_expression_list & arguments() const
\brief Assignment of a data expression to a string
const core::identifier_string & lhs() const
const data_expression & rhs() const
\brief An untyped identifier
\brief Multiple possible sorts
const sort_expression_list & sorts() const
universal quantification.
\brief Untyped sort variable
\brief Unknown sort expression
untyped_sort()
\brief Default constructor X3.
const core::identifier_string & name() const
const sort_expression & sort() const
\brief A where expression
const data_expression & body() const
const assignment_expression_list & declarations() const
D_ParserTables parser_tables_mcrl2
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
const aterm_string & empty_string()
Returns the empty aterm_string.
bool check_term_PREqnSpec(const Term &t)
bool check_term_MapSpec(const Term &t)
bool check_term_PBESTrue(const Term &t)
bool check_term_Seq(const Term &t)
bool check_term_DataVarIdInit(const Term &t)
bool check_rule_DataVarIdInit(const Term &t)
bool check_term_Action(const Term &t)
bool check_term_PRESOr(const Term &t)
bool check_term_SortId(const Term &t)
bool check_term_Sum(const Term &t)
bool check_term_Whr(const Term &t)
bool check_term_ActAt(const Term &t)
bool check_rule_WhrDecl(const Term &t)
bool check_term_StateInfimum(const Term &t)
bool check_term_CommExpr(const Term &t)
bool check_rule_ActSpec(const Term &t)
bool check_term_UntypedSortUnknown(const Term &t)
bool check_term_ActFalse(const Term &t)
bool check_term_ActId(const Term &t)
bool check_term_RegTrans(const Term &t)
bool check_rule_Distribution(const Term &t)
bool check_term_LinearProcessSummand(const Term &t)
bool check_rule_Number(const Term &t)
bool check_term_StateFalse(const Term &t)
bool check_term_argument(const Term &t, CheckFunction f)
bool check_term_UntypedSortVariable(const Term &t)
bool check_rule_ActFrm(const Term &t)
bool check_term_MultAct(const Term &t)
bool check_term_Tau(const Term &t)
bool check_rule_ActId(const Term &t)
bool check_term_UntypedProcessAssignment(const Term &t)
bool check_term_StateDelayTimed(const Term &t)
bool check_term_Delta(const Term &t)
bool check_rule_PBEqn(const Term &t)
bool check_rule_Action(const Term &t)
bool check_term_PRESTrue(const Term &t)
bool check_rule_ActionRenameSpec(const Term &t)
bool check_rule_FixPoint(const Term &t)
bool check_list_argument(const Term &t, CheckFunction f, unsigned int minimum_size)
bool check_rule_DataEqn(const Term &t)
bool check_rule_LinProcSpec(const Term &t)
bool check_term_PRES(const Term &t)
bool check_rule_SortDecl(const Term &t)
bool check_rule_RenameExpr(const Term &t)
bool check_term_ActImp(const Term &t)
bool check_term_Allow(const Term &t)
bool check_term_Choice(const Term &t)
bool check_term_LinProcSpec(const Term &t)
bool check_rule_SortId(const Term &t)
bool check_term_PBESNot(const Term &t)
bool check_term_Sync(const Term &t)
bool check_rule_String(const Term &t)
bool check_term_ActMultAct(const Term &t)
bool check_term_PRESCondEq(const Term &t)
bool check_term_RegTransOrNil(const Term &t)
bool check_term_GlobVarSpec(const Term &t)
bool check_term_StateSupremum(const Term &t)
bool check_term_Mu(const Term &t)
bool check_rule_BindingOperator(const Term &t)
bool check_rule_CommExpr(const Term &t)
bool check_term_UntypedIdentifierAssignment(const Term &t)
bool check_term_RegNil(const Term &t)
bool check_term_DataEqn(const Term &t)
bool check_term_UntypedIdentifier(const Term &t)
bool check_term_StateMust(const Term &t)
bool check_rule_StructProj(const Term &t)
bool check_rule_ConsSpec(const Term &t)
bool check_term_ProcEqnSpec(const Term &t)
bool check_term_LMerge(const Term &t)
bool check_term_ConsSpec(const Term &t)
bool check_rule_SortConsType(const Term &t)
bool check_term_SortSet(const Term &t)
bool check_rule_SortSpec(const Term &t)
bool check_rule_PRES(const Term &t)
bool check_term_Binder(const Term &t)
bool check_term_SortArrow(const Term &t)
bool check_rule_DataExpr(const Term &t)
bool check_term_StateSum(const Term &t)
bool check_term_DataVarId(const Term &t)
bool check_term_UntypedDataParameter(const Term &t)
bool check_term_PRESConstantMultiply(const Term &t)
bool check_term_PBESForall(const Term &t)
bool check_rule_DataEqnSpec(const Term &t)
bool check_term_ActTrue(const Term &t)
bool check_rule_MultActOrDelta(const Term &t)
bool check_rule_LinearProcess(const Term &t)
bool check_term_ProcessInit(const Term &t)
bool check_term_BagComp(const Term &t)
bool check_rule_ProcVarId(const Term &t)
bool check_term_SortFBag(const Term &t)
bool check_rule_PRExpr(const Term &t)
bool check_term_StateYaled(const Term &t)
bool check_term_MultActName(const Term &t)
bool check_term_Nu(const Term &t)
bool check_term_PBESExists(const Term &t)
bool check_term_BInit(const Term &t)
bool check_term_ProcessAssignment(const Term &t)
bool check_term_Lambda(const Term &t)
bool check_term_StateMay(const Term &t)
bool check_term_PRESAnd(const Term &t)
bool check_term_StateVar(const Term &t)
bool check_term_SortRef(const Term &t)
bool check_term_PRESEqInf(const Term &t)
bool check_rule_StateFrm(const Term &t)
bool check_term_ProcSpec(const Term &t)
bool check_term_SortBag(const Term &t)
bool check_term_ProcEqn(const Term &t)
bool check_rule_MultActName(const Term &t)
bool check_term_StatePlus(const Term &t)
bool check_term_TimedMultAct(const Term &t)
bool check_term_PRESInfimum(const Term &t)
bool check_term_Rename(const Term &t)
bool check_rule_MapSpec(const Term &t)
bool check_rule_ProcEqnSpec(const Term &t)
bool check_rule_ProcEqn(const Term &t)
bool check_rule_PREqn(const Term &t)
bool check_term_StateYaledTimed(const Term &t)
bool check_term_StateImp(const Term &t)
bool check_term_StateConstantMultiply(const Term &t)
bool check_rule_DataVarId(const Term &t)
bool check_rule_UntypedIdentifierAssignment(const Term &t)
bool check_term_SortCons(const Term &t)
bool check_term_PRESSupremum(const Term &t)
bool check_term_PropVarInst(const Term &t)
bool check_term_UntypedRegFrm(const Term &t)
bool check_rule_PBES(const Term &t)
bool check_term_IfThen(const Term &t)
bool check_term_ActForall(const Term &t)
bool check_term_StateTrue(const Term &t)
bool check_term_SortSpec(const Term &t)
bool check_term_StateOr(const Term &t)
bool check_term_Forall(const Term &t)
bool check_term_UntypedSetBagComp(const Term &t)
bool check_term_LinearProcess(const Term &t)
bool check_term_PBInit(const Term &t)
bool check_rule_ProcExpr(const Term &t)
bool check_term_Comm(const Term &t)
bool check_term_StateAnd(const Term &t)
bool check_term_PBESOr(const Term &t)
bool check_term_StateMinus(const Term &t)
bool check_term_RenameExpr(const Term &t)
bool check_term_ActExists(const Term &t)
bool check_term_LinearProcessInit(const Term &t)
bool check_rule_SortExpr(const Term &t)
bool check_term_PREqn(const Term &t)
bool check_term_UntypedMultiAction(const Term &t)
bool check_term_PBES(const Term &t)
bool check_rule_GlobVarSpec(const Term &t)
bool check_rule_ActionRenameRuleRHS(const Term &t)
bool check_term_ActAnd(const Term &t)
bool check_rule_DataSpec(const Term &t)
bool check_term_AtTime(const Term &t)
bool check_term_ActSpec(const Term &t)
bool check_term_StateMu(const Term &t)
bool check_rule_LinearProcessSummand(const Term &t)
bool check_rule_StringOrEmpty(const Term &t)
bool check_term_StateNu(const Term &t)
bool check_term_PBEqn(const Term &t)
bool check_term_PRESSum(const Term &t)
bool check_term_ActionRenameSpec(const Term &t)
bool check_term_StateDelay(const Term &t)
bool check_rule_PBEqnSpec(const Term &t)
bool check_term_SortStruct(const Term &t)
bool check_rule_RegFrm(const Term &t)
bool check_rule_ActionRenameRules(const Term &t)
bool check_term_StochasticOperator(const Term &t)
bool check_rule_ProcSpec(const Term &t)
bool check_term_PBESImp(const Term &t)
bool gsIsDataAppl(const atermpp::aterm &Term)
bool check_rule_PropVarDecl(const Term &t)
bool check_term_StateForall(const Term &t)
bool check_term_PRInit(const Term &t)
bool check_term_DataEqnSpec(const Term &t)
bool check_term_StructCons(const Term &t)
bool check_rule_ParamIdOrAction(const Term &t)
bool check_term_ProcVarId(const Term &t)
bool check_term_PRESConstantMultiplyAlt(const Term &t)
bool check_term_DataSpec(const Term &t)
bool check_term_Process(const Term &t)
bool check_term_ActionRenameRule(const Term &t)
bool check_rule_ActionRenameRule(const Term &t)
bool check_rule_PBExpr(const Term &t)
bool check_term_StateNot(const Term &t)
bool check_term_PRESFalse(const Term &t)
bool check_rule_UntypedMultiAction(const Term &t)
bool check_term_OpId(const Term &t)
bool check_term_Distribution(const Term &t)
bool check_term_ActNot(const Term &t)
bool check_term_PRESEqNInf(const Term &t)
bool check_term_UntypedSortsPossible(const Term &t)
bool check_rule_UntypedDataParameter(const Term &t)
bool check_term_Hide(const Term &t)
bool check_rule_PREqnSpec(const Term &t)
bool check_rule_TimedMultAct(const Term &t)
bool check_term_Merge(const Term &t)
bool check_rule_PropVarInst(const Term &t)
bool check_term_Exists(const Term &t)
bool check_term_SetComp(const Term &t)
bool check_term_ActOr(const Term &t)
bool check_term_StructProj(const Term &t)
bool check_term_PRESMinus(const Term &t)
bool check_rule_MultAct(const Term &t)
bool check_term_SortList(const Term &t)
bool check_term_PBEqnSpec(const Term &t)
bool check_rule_LinearProcessInit(const Term &t)
bool check_rule_PBInit(const Term &t)
bool check_term_IfThenElse(const Term &t)
bool check_term_PBESAnd(const Term &t)
bool check_rule_ProcInit(const Term &t)
bool check_term_PBESFalse(const Term &t)
bool check_rule_StructCons(const Term &t)
bool check_term_PRESPlus(const Term &t)
bool check_rule_OpId(const Term &t)
bool check_term_PropVarDecl(const Term &t)
bool check_term_SortFSet(const Term &t)
bool check_term_PRESCondSm(const Term &t)
bool check_term_Block(const Term &t)
bool check_term_StateExists(const Term &t)
bool check_term_ActionRenameRules(const Term &t)
bool check_term_StateConstantMultiplyAlt(const Term &t)
bool check_term_DataAppl(const Term &t)
bool check_term_RegSeq(const Term &t)
bool check_term_PRESImp(const Term &t)
bool check_term_RegAlt(const Term &t)
bool check_rule_PRInit(const Term &t)
apply_builder< Builder > make_apply_builder()
update_apply_builder_arg1< Builder, Function, Arg1 > make_update_apply_builder_arg1(const Function &f)
void warn_and_or(const parse_node &)
Prints a warning for each occurrence of 'x && y || z' in the parse tree.
apply_builder_arg1< Builder, Arg1 > make_apply_builder_arg1(const Arg1 &arg1)
update_apply_builder< Builder, Function > make_update_apply_builder(const Function &f)
apply_builder_arg2< Builder, Arg1, Arg2 > make_apply_builder_arg2(const Arg1 &arg1, const Arg2 &arg2)
data_expression parse_data_expression(const std::string &text)
data_specification parse_data_specification_new(const std::string &text)
variable_list parse_variable_declaration_list(const std::string &text)
variable_list parse_variables(const std::string &text)
sort_expression parse_sort_expression(const std::string &text)
Namespace for system defined sort bag.
function_symbol fbag2fset(const sort_expression &s)
Constructor for function symbol @fbag2fset.
bool is_bag2set_application(const atermpp::aterm &e)
Recogniser for application of Bag2Set.
bool is_intersection_function_symbol(const atermpp::aterm &e)
Recogniser for function *.
void make_bool2nat_function(data_expression &result, const sort_expression &s, const data_expression &arg0)
Make an application of function symbol @Bool2Nat_.
application difference(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol -.
const core::identifier_string & fbag2fset_name()
Generate identifier @fbag2fset.
const data_expression & right(const data_expression &e)
Function for projecting out argument. right from an application.
bool is_min_function_function_symbol(const atermpp::aterm &e)
Recogniser for function @min_.
function_symbol bag_fbag(const sort_expression &s)
Constructor for function symbol @bagfbag.
bool is_min_function_application(const atermpp::aterm &e)
Recogniser for application of @min_.
function_symbol monus_function(const sort_expression &s)
Constructor for function symbol @monus_.
const core::identifier_string & fbag_intersect_name()
Generate identifier @fbag_inter.
void make_bag2set(data_expression &result, const sort_expression &s, const data_expression &arg0)
Make an application of function symbol Bag2Set.
bool is_fbag_difference_function_symbol(const atermpp::aterm &e)
Recogniser for function @fbag_diff.
bool is_fbag_join_function_symbol(const atermpp::aterm &e)
Recogniser for function @fbag_join.
void make_count(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol count.
function_symbol_vector bag_generate_functions_code(const sort_expression &s)
Give all system defined mappings for bag.
application zero_function(const sort_expression &s, const data_expression &arg0)
Application of function symbol @zero_.
const core::identifier_string & bool2nat_function_name()
Generate identifier @Bool2Nat_.
void make_one_function(data_expression &result, const sort_expression &s, const data_expression &arg0)
Make an application of function symbol @one_.
const data_expression & arg3(const data_expression &e)
Function for projecting out argument. arg3 from an application.
bool is_difference_application(const atermpp::aterm &e)
Recogniser for application of -.
function_symbol difference(const sort_expression &s, const sort_expression &s0, const sort_expression &s1)
const core::identifier_string & set2bag_name()
Generate identifier Set2Bag.
bool is_bag_fbag_application(const atermpp::aterm &e)
Recogniser for application of @bagfbag.
application fbag2fset(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol @fbag2fset.
function_symbol_vector bag_generate_constructors_and_functions_code(const sort_expression &s)
Give all system defined mappings and constructors for bag.
void make_add_function(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol @add_.
data_equation_vector bag_generate_equations_code(const sort_expression &s)
Give all system defined equations for bag.
bool is_fbag_difference_application(const atermpp::aterm &e)
Recogniser for application of @fbag_diff.
bool is_bag_fbag_function_symbol(const atermpp::aterm &e)
Recogniser for function @bagfbag.
const core::identifier_string & zero_function_name()
Generate identifier @zero_.
const core::identifier_string & add_function_name()
Generate identifier @add_.
application bag2set(const sort_expression &s, const data_expression &arg0)
Application of function symbol Bag2Set.
application in(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol in.
function_symbol_vector bag_mCRL2_usable_constructors(const sort_expression &s)
Give all defined constructors which can be used in mCRL2 specs for bag.
bool is_fbag2fset_function_symbol(const atermpp::aterm &e)
Recogniser for function @fbag2fset.
bool is_union_application(const atermpp::aterm &e)
Recogniser for application of +.
function_symbol bag2set(const sort_expression &s)
Constructor for function symbol Bag2Set.
bool is_monus_function_application(const atermpp::aterm &e)
Recogniser for application of @monus_.
const core::identifier_string & nat2bool_function_name()
Generate identifier @Nat2Bool_.
function_symbol intersection(const sort_expression &s, const sort_expression &s0, const sort_expression &s1)
bool is_zero_function_application(const atermpp::aterm &e)
Recogniser for application of @zero_.
const core::identifier_string & fbag_difference_name()
Generate identifier @fbag_diff.
void make_monus_function(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol @monus_.
bool is_count_function_symbol(const atermpp::aterm &e)
Recogniser for function count.
function_symbol count(const sort_expression &, const sort_expression &s0, const sort_expression &s1)
function_symbol add_function(const sort_expression &s)
Constructor for function symbol @add_.
bool is_nat2bool_function_application(const atermpp::aterm &e)
Recogniser for application of @Nat2Bool_.
function_symbol fbag_intersect(const sort_expression &s)
Constructor for function symbol @fbag_inter.
void make_fbag_intersect(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1, const data_expression &arg2, const data_expression &arg3)
Make an application of function symbol @fbag_inter.
bool is_union_function_symbol(const atermpp::aterm &e)
Recogniser for function +.
void make_nat2bool_function(data_expression &result, const sort_expression &s, const data_expression &arg0)
Make an application of function symbol @Nat2Bool_.
application bag_fbag(const sort_expression &s, const data_expression &arg0)
Application of function symbol @bagfbag.
bool is_fbag_intersect_application(const atermpp::aterm &e)
Recogniser for application of @fbag_inter.
bool is_in_application(const atermpp::aterm &e)
Recogniser for application of in.
function_symbol fbag_difference(const sort_expression &s)
Constructor for function symbol @fbag_diff.
bool is_in_function_symbol(const atermpp::aterm &e)
Recogniser for function in.
application bool2nat_function(const sort_expression &s, const data_expression &arg0)
Application of function symbol @Bool2Nat_.
bool is_bag_comprehension_function_symbol(const atermpp::aterm &e)
Recogniser for function @bagcomp.
void make_min_function(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol @min_.
const core::identifier_string & min_function_name()
Generate identifier @min_.
bool is_set2bag_function_symbol(const atermpp::aterm &e)
Recogniser for function Set2Bag.
application union_(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol +.
const data_expression & left(const data_expression &e)
Function for projecting out argument. left from an application.
function_symbol_vector bag_mCRL2_usable_mappings(const sort_expression &s)
Give all system defined mappings that can be used in mCRL2 specs for bag.
bool is_nat2bool_function_function_symbol(const atermpp::aterm &e)
Recogniser for function @Nat2Bool_.
application one_function(const sort_expression &s, const data_expression &arg0)
Application of function symbol @one_.
const core::identifier_string & monus_function_name()
Generate identifier @monus_.
const data_expression & arg4(const data_expression &e)
Function for projecting out argument. arg4 from an application.
bool is_add_function_application(const atermpp::aterm &e)
Recogniser for application of @add_.
void make_fbag2fset(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol @fbag2fset.
void make_fbag_join(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1, const data_expression &arg2, const data_expression &arg3)
Make an application of function symbol @fbag_join.
function_symbol min_function(const sort_expression &s)
Constructor for function symbol @min_.
function_symbol set2bag(const sort_expression &s)
Constructor for function symbol Set2Bag.
const core::identifier_string & bag_fbag_name()
Generate identifier @bagfbag.
const core::identifier_string & bag2set_name()
Generate identifier Bag2Set.
const core::identifier_string & intersection_name()
Generate identifier *.
application nat2bool_function(const sort_expression &s, const data_expression &arg0)
Application of function symbol @Nat2Bool_.
void make_in(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol in.
application constructor(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol @bag.
application fbag_intersect(const sort_expression &s, const data_expression &arg0, const data_expression &arg1, const data_expression &arg2, const data_expression &arg3)
Application of function symbol @fbag_inter.
function_symbol bag_comprehension(const sort_expression &s)
Constructor for function symbol @bagcomp.
bool is_bag2set_function_symbol(const atermpp::aterm &e)
Recogniser for function Bag2Set.
implementation_map bag_cpp_implementable_constructors(const sort_expression &)
Give all system defined constructors which have an implementation in C++ and not in rewrite rules for...
bool is_bool2nat_function_application(const atermpp::aterm &e)
Recogniser for application of @Bool2Nat_.
const core::identifier_string & fbag_join_name()
Generate identifier @fbag_join.
void make_intersection(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol *.
function_symbol fbag_join(const sort_expression &s)
Constructor for function symbol @fbag_join.
bool is_constructor_application(const atermpp::aterm &e)
Recogniser for application of @bag.
bool is_zero_function_function_symbol(const atermpp::aterm &e)
Recogniser for function @zero_.
function_symbol constructor(const sort_expression &s)
Constructor for function symbol @bag.
const data_expression & arg2(const data_expression &e)
Function for projecting out argument. arg2 from an application.
const core::identifier_string & constructor_name()
Generate identifier @bag.
bool is_bag_comprehension_application(const atermpp::aterm &e)
Recogniser for application of @bagcomp.
bool is_set2bag_application(const atermpp::aterm &e)
Recogniser for application of Set2Bag.
function_symbol in(const sort_expression &, const sort_expression &s0, const sort_expression &s1)
void make_zero_function(data_expression &result, const sort_expression &s, const data_expression &arg0)
Make an application of function symbol @zero_.
const data_expression & arg1(const data_expression &e)
Function for projecting out argument. arg1 from an application.
void make_bag_fbag(data_expression &result, const sort_expression &s, const data_expression &arg0)
Make an application of function symbol @bagfbag.
function_symbol bool2nat_function(const sort_expression &s)
Constructor for function symbol @Bool2Nat_.
void make_set2bag(data_expression &result, const sort_expression &s, const data_expression &arg0)
Make an application of function symbol Set2Bag.
const core::identifier_string & union_name()
Generate identifier +.
bool is_fbag_intersect_function_symbol(const atermpp::aterm &e)
Recogniser for function @fbag_inter.
function_symbol union_(const sort_expression &s, const sort_expression &s0, const sort_expression &s1)
implementation_map bag_cpp_implementable_mappings(const sort_expression &)
Give all system defined mappings that are to be implemented in C++ code for bag.
bool is_intersection_application(const atermpp::aterm &e)
Recogniser for application of *.
void make_bag_comprehension(data_expression &result, const sort_expression &s, const data_expression &arg0)
Make an application of function symbol @bagcomp.
const data_expression & arg(const data_expression &e)
Function for projecting out argument. arg from an application.
void make_fbag_difference(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1, const data_expression &arg2, const data_expression &arg3)
Make an application of function symbol @fbag_diff.
const core::identifier_string & count_name()
Generate identifier count.
function_symbol nat2bool_function(const sort_expression &s)
Constructor for function symbol @Nat2Bool_.
bool is_one_function_application(const atermpp::aterm &e)
Recogniser for application of @one_.
application fbag_difference(const sort_expression &s, const data_expression &arg0, const data_expression &arg1, const data_expression &arg2, const data_expression &arg3)
Application of function symbol @fbag_diff.
application add_function(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol @add_.
const core::identifier_string & difference_name()
Generate identifier -.
application set2bag(const sort_expression &s, const data_expression &arg0)
Application of function symbol Set2Bag.
bool is_bool2nat_function_function_symbol(const atermpp::aterm &e)
Recogniser for function @Bool2Nat_.
bool is_bag(const sort_expression &e)
Recogniser for sort expression Bag(s)
application monus_function(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol @monus_.
container_sort bag(const sort_expression &s)
Constructor for sort expression Bag(S)
bool is_difference_function_symbol(const atermpp::aterm &e)
Recogniser for function -.
bool is_fbag2fset_application(const atermpp::aterm &e)
Recogniser for application of @fbag2fset.
application intersection(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol *.
const core::identifier_string & in_name()
Generate identifier in.
bool is_constructor_function_symbol(const atermpp::aterm &e)
Recogniser for function @bag.
const core::identifier_string & bag_comprehension_name()
Generate identifier @bagcomp.
bool is_count_application(const atermpp::aterm &e)
Recogniser for application of count.
void make_difference(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol -.
application fbag_join(const sort_expression &s, const data_expression &arg0, const data_expression &arg1, const data_expression &arg2, const data_expression &arg3)
Application of function symbol @fbag_join.
const core::identifier_string & one_function_name()
Generate identifier @one_.
bool is_add_function_function_symbol(const atermpp::aterm &e)
Recogniser for function @add_.
void make_constructor(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol @bag.
function_symbol zero_function(const sort_expression &s)
Constructor for function symbol @zero_.
bool is_one_function_function_symbol(const atermpp::aterm &e)
Recogniser for function @one_.
application bag_comprehension(const sort_expression &s, const data_expression &arg0)
Application of function symbol @bagcomp.
function_symbol one_function(const sort_expression &s)
Constructor for function symbol @one_.
application count(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol count.
application min_function(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol @min_.
void make_union(data_expression &result, const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol +.
function_symbol_vector bag_generate_constructors_code(const sort_expression &s)
Give all system defined constructors for bag.
bool is_fbag_join_application(const atermpp::aterm &e)
Recogniser for application of @fbag_join.
bool is_monus_function_function_symbol(const atermpp::aterm &e)
Recogniser for function @monus_.
Namespace for system defined sort bool_.
const basic_sort & bool_()
Constructor for sort expression Bool.
Namespace for system defined sort fbag.
container_sort fbag(const sort_expression &s)
Constructor for sort expression FBag(S)
Namespace for system defined sort fset.
container_sort fset(const sort_expression &s)
Constructor for sort expression FSet(S)
Namespace for system defined sort nat.
const basic_sort & nat()
Constructor for sort expression Nat.
Namespace for system defined sort pos.
const basic_sort & pos()
Constructor for sort expression Pos.
Namespace for system defined sort set_.
container_sort set_(const sort_expression &s)
Constructor for sort expression Set(S)
std::string pp(const data::structured_sort_constructor_argument &x, bool arg0)
data::data_equation normalize_sorts(const data::data_equation &x, const data::sort_specification &sortspec)
void normalize_sorts(data::data_equation_vector &x, const data::sort_specification &sortspec)
bool is_structured_sort(const atermpp::aterm &x)
Returns true if the term t is a structured sort.
data::data_equation_list normalize_sorts(const data::data_equation_list &x, const data::sort_specification &sortspec)
std::string pp(const data::exists &x, bool arg0)
std::string pp(const data::untyped_identifier_assignment &x, bool arg0)
std::ostream & operator<<(std::ostream &out, const basic_sort &x)
std::set< data::variable > find_all_variables(const data::data_expression_list &x)
std::string pp(const data::list_container &x, bool arg0)
std::set< data::sort_expression > find_sort_expressions(const data::data_expression &x)
data::data_equation translate_user_notation(const data::data_equation &x)
bool is_application(const data_expression &t)
Returns true if the term t is an application.
void make_basic_sort(atermpp::aterm &t, const ARGUMENTS &... args)
function_sort make_function_sort_(const sort_expression &dom1, const sort_expression &dom2, const sort_expression &dom3, const sort_expression &dom4, const sort_expression &codomain)
Convenience constructor for function sort with domain size 4.
void swap(basic_sort &t1, basic_sort &t2) noexcept
\brief swap overload
std::string pp(const data::container_type &x, bool arg0)
std::set< data::variable > find_all_variables(const data::data_expression &x)
bool is_where_clause(const atermpp::aterm &x)
Returns true if the term t is a where clause.
std::string pp(const data::set_container &x, bool arg0)
bool is_untyped_possible_sorts(const atermpp::aterm &x)
Returns true if the term t is an expression for multiple possible sorts.
bool is_untyped_sort(const atermpp::aterm &x)
Returns true if the term t is the unknown sort.
std::string pp(const data::untyped_set_or_bag_comprehension_binder &x, bool arg0)
data::data_expression translate_user_notation(const data::data_expression &x)
std::string pp(const data::sort_expression_vector &x, bool arg0)
std::string pp(const data::untyped_sort &x, bool arg0)
std::string pp(const data::data_equation &x, bool arg0)
std::string pp(const data::forall &x, bool arg0)
bool is_abstraction(const atermpp::aterm &x)
Returns true if the term t is an abstraction.
std::string pp(const data::assignment_list &x, bool arg0)
std::string pp(const data::untyped_identifier &x, bool arg0)
std::string pp(const data::function_symbol_list &x, bool arg0)
function_sort make_function_sort_(const sort_expression &dom1, const sort_expression &codomain)
Convenience constructor for function sort with domain size 1.
bool is_untyped_identifier(const atermpp::aterm &x)
Returns true if the term t is an identifier.
std::string pp(const data::lambda_binder &x, bool arg0)
std::ostream & operator<<(std::ostream &out, const alias &x)
std::set< data::variable > find_all_variables(const data::function_symbol &x)
std::string pp(const data::application &x, bool arg0)
std::string pp(const data::function_sort &x, bool arg0)
void make_alias(atermpp::aterm &t, const ARGUMENTS &... args)
std::string pp(const data::abstraction &x, bool arg0)
std::string pp(const data::bag_comprehension_binder &x, bool arg0)
std::string pp(const data::set_comprehension_binder &x, bool arg0)
std::string pp(const data::assignment &x, bool arg0)
std::string pp(const data::structured_sort &x, bool arg0)
std::string pp(const data::basic_sort &x, bool arg0)
std::string pp(const data::exists_binder &x, bool arg0)
std::string pp(const data::bag_comprehension &x, bool arg0)
bool is_container_sort(const atermpp::aterm &x)
Returns true if the term t is a container sort.
bool is_forall(const atermpp::aterm &x)
Returns true if the term t is a universal quantification.
std::string pp(const data::variable &x, bool arg0)
bool is_function_symbol(const atermpp::aterm &x)
Returns true if the term t is a function symbol.
bool is_basic_sort(const atermpp::aterm &x)
Returns true if the term t is a basic sort.
bool is_untyped_sort_variable(const atermpp::aterm &x)
std::string pp(const data::where_clause &x, bool arg0)
std::set< data::sort_expression > find_sort_expressions(const data::data_equation &x)
std::set< data::function_symbol > find_function_symbols(const data::data_equation &x)
std::string pp(const data::bag_container &x, bool arg0)
std::string pp(const data::alias &x, bool arg0)
std::set< data::variable > find_free_variables(const data::data_expression &x)
void swap(sort_expression &t1, sort_expression &t2) noexcept
\brief swap overload
std::set< data::variable > find_all_variables(const data::variable_list &x)
bool is_untyped_set_or_bag_comprehension(const atermpp::aterm &x)
Returns true if the term t is a set/bag comprehension.
void swap(alias &t1, alias &t2) noexcept
\brief swap overload
bool is_assignment(const atermpp::aterm &x)
std::string pp(const data::structured_sort_constructor &x, bool arg0)
std::set< data::sort_expression > find_sort_expressions(const data::sort_expression &x)
std::string pp(const data::data_specification &x, bool arg0)
std::string pp(const data::data_equation_list &x, bool arg0)
std::string pp(const data::fset_container &x, bool arg0)
std::string pp(const data::sort_expression &x, bool arg0)
std::string pp(const data::untyped_set_or_bag_comprehension &x, bool arg0)
std::pair< basic_sort_vector, alias_vector > parse_sort_specification(const std::string &text)
data::sort_expression normalize_sorts(const data::sort_expression &x, const data::sort_specification &sortspec)
bool is_exists(const atermpp::aterm &x)
Returns true if the term t is an existential quantification.
std::string pp(const data::variable_list &x, bool arg0)
bool is_function_sort(const atermpp::aterm &x)
Returns true if the term t is a function sort.
std::set< data::variable > find_free_variables(const data::data_expression_list &x)
std::string pp(const data::data_expression &x, bool arg0)
std::string pp(const data::lambda &x, bool arg0)
bool is_bag_comprehension(const atermpp::aterm &x)
Returns true if the term t is a bag comprehension.
std::string pp(const data::fbag_container &x, bool arg0)
bool is_set_comprehension(const atermpp::aterm &x)
Returns true if the term t is a set comprehension.
std::string pp(const data::structured_sort_constructor_list &x, bool arg0)
bool is_machine_number(const atermpp::aterm &x)
Returns true if the term t is a machine_number.
std::string pp(const data::container_sort &x, bool arg0)
data::variable_list normalize_sorts(const data::variable_list &x, const data::sort_specification &sortspec)
data::data_expression normalize_sorts(const data::data_expression &x, const data::sort_specification &sortspec)
function_sort make_function_sort_(const sort_expression &dom1, const sort_expression &dom2, const sort_expression &codomain)
Convenience constructor for function sort with domain size 2.
std::string pp(const data::untyped_sort_variable &x, bool arg0)
std::string pp(const data::untyped_data_parameter &x, bool arg0)
std::string pp(const data::binder_type &x, bool arg0)
bool is_lambda(const atermpp::aterm &x)
Returns true if the term t is a lambda abstraction.
bool is_untyped_identifier_assignment(const atermpp::aterm &x)
bool is_alias(const atermpp::aterm &x)
std::set< data::variable > find_all_variables(const data::variable &x)
std::set< core::identifier_string > find_identifiers(const data::variable_list &x)
std::ostream & operator<<(std::ostream &out, const sort_expression &x)
bool search_variable(const data::data_expression &x, const data::variable &v)
std::string pp(const data::sort_expression_list &x, bool arg0)
std::string pp(const data::forall_binder &x, bool arg0)
std::string pp(const data::untyped_possible_sorts &x, bool arg0)
std::string pp(const data::function_symbol &x, bool arg0)
std::set< data::variable > substitution_variables(const mutable_map_substitution<> &sigma)
std::string pp(const data::machine_number &x, bool arg0)
std::string pp(const data::assignment_expression &x, bool arg0)
bool is_variable(const atermpp::aterm &x)
Returns true if the term t is a variable.
bool is_sort_expression(const atermpp::aterm &x)
Test for a sort_expression expression.
std::string pp(const data::set_comprehension &x, bool arg0)
std::string pp(const data::data_expression_list &x, bool arg0)
expression builder that visits all sub expressions
static const atermpp::aterm SortExpr
static const atermpp::aterm SortId
static const atermpp::aterm SortRef
void apply(T &result, const argument_type &x)
update_apply_builder(const Function &f)
void apply(T &result, const data::bag_comprehension &x)
void apply(T &result, const data::machine_number &x)
void apply(T &result, const data::untyped_identifier_assignment &x)
void apply(T &result, const data::assignment_expression &x)
void apply(T &result, const data::untyped_set_or_bag_comprehension &x)
void apply(T &result, const data::untyped_identifier &x)
void apply(T &result, const data::data_equation &x)
void apply(T &result, const data::function_symbol &x)
void apply(T &result, const data::assignment &x)
void apply(T &result, const data::abstraction &x)
void apply(T &result, const data::forall &x)
void apply(T &result, const data::untyped_data_parameter &x)
void apply(T &result, const data::exists &x)
void apply(T &result, const data::where_clause &x)
void apply(T &result, const data::application &x)
void apply(T &result, const data::variable &x)
void apply(T &result, const data::data_expression &x)
void apply(T &result, const data::set_comprehension &x)
void apply(T &result, const data::lambda &x)
void apply(T &result, const data::assignment &x)
void apply(T &result, const data::set_comprehension &x)
void apply(T &result, const data::structured_sort_constructor_argument &x)
void apply(T &result, const data::container_sort &x)
void apply(T &result, const data::alias &x)
void apply(T &result, const data::exists &x)
void apply(T &result, const data::machine_number &x)
void apply(T &result, const data::function_symbol &x)
void apply(T &result, const data::untyped_possible_sorts &x)
void apply(T &result, const data::forall &x)
void apply(T &result, const data::basic_sort &x)
void apply(T &result, const data::data_equation &x)
void apply(T &result, const data::untyped_sort &x)
void apply(T &result, const data::abstraction &x)
void apply(T &result, const data::application &x)
void apply(T &result, const data::variable &x)
void apply(T &result, const data::structured_sort &x)
void apply(T &result, const data::untyped_identifier_assignment &x)
void apply(T &result, const data::untyped_data_parameter &x)
void apply(T &result, const data::function_sort &x)
void apply(T &result, const data::untyped_identifier &x)
void apply(T &result, const data::structured_sort_constructor &x)
void apply(T &result, const data::lambda &x)
void apply(T &result, const data::untyped_set_or_bag_comprehension &x)
void apply(T &result, const data::where_clause &x)
void apply(T &result, const data::assignment_expression &x)
void apply(T &result, const data::data_expression &x)
void apply(T &result, const data::sort_expression &x)
void apply(T &result, const data::untyped_sort_variable &x)
void apply(T &result, const data::bag_comprehension &x)
void apply(T &result, const data::abstraction &x)
void apply(T &result, const data::application &x)
void apply(T &result, const data::untyped_data_parameter &x)
void apply(T &result, const data::untyped_identifier &x)
void apply(T &result, const data::data_expression &x)
void apply(T &result, const data::assignment_expression &x)
void apply(T &result, const data::where_clause &x)
void apply(T &result, const data::forall &x)
void apply(T &result, const data::function_symbol &x)
void apply(T &result, const data::exists &x)
void apply(T &result, const data::lambda &x)
void apply(T &result, const data::variable &x)
void apply(T &result, const data::assignment &x)
void apply(T &result, const data::untyped_identifier_assignment &x)
void apply(T &result, const data::untyped_set_or_bag_comprehension &x)
void apply(T &result, const data::set_comprehension &x)
void apply(T &result, const data::bag_comprehension &x)
void apply(T &result, const data::machine_number &x)
void apply(T &result, const data::data_equation &x)
data_expression_actions(const core::parser &parser_)
data::data_expression parse_DataExpr(const core::parse_node &node) const
data_specification_actions(const core::parser &parser_)
untyped_data_specification parse_DataSpec(const core::parse_node &node) const
normalize_sorts_function(const sort_specification &sort_spec)
sort_expression operator()(const sort_expression &e) const
Normalise sorts.
const std::map< sort_expression, sort_expression > & m_normalised_aliases
data::sort_expression parse_SortExpr(const core::parse_node &node, data::sort_expression_list *product=nullptr) const
data_specification construct_data_specification() const
std::size_t operator()(const mcrl2::data::sort_expression &x) const