mCRL2
Loading...
Searching...
No Matches
pos64.h
Go to the documentation of this file.
1// Author(s): Jeroen Keiren
2// Copyright: see the accompanying file COPYING or copy at
3// https://github.com/mCRL2org/mCRL2/blob/master/COPYING
4//
5// Distributed under the Boost Software License, Version 1.0.
6// (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8//
14
15#ifndef MCRL2_DATA_POS64_H
16#define MCRL2_DATA_POS64_H
17
18#include "functional" // std::function
25#include "mcrl2/data/standard.h"
26#include "mcrl2/data/bool.h"
28
29namespace mcrl2 {
30
31 namespace data {
32
34 namespace sort_pos {
35
36 inline
38 {
40 return pos_name;
41 }
42
45 inline
46 const basic_sort& pos()
47 {
48 static basic_sort pos = basic_sort(pos_name());
49 return pos;
50 }
51
55 inline
56 bool is_pos(const sort_expression& e)
57 {
58 if (is_basic_sort(e))
59 {
60 return basic_sort(e) == pos();
61 }
62 return false;
63 }
64
65
68 inline
70 {
72 return c1_name;
73 }
74
76
78 inline
79 const function_symbol& c1()
80 {
81 static function_symbol c1(c1_name(), pos());
82 return c1;
83 }
84
88 inline
90 {
91 if (is_function_symbol(e))
92 {
93 return atermpp::down_cast<function_symbol>(e) == c1();
94 }
95 return false;
96 }
97
100 inline
102 {
104 return succpos_name;
105 }
106
108
110 inline
112 {
114 return succpos;
115 }
116
120 inline
122 {
123 if (is_function_symbol(e))
124 {
125 return atermpp::down_cast<function_symbol>(e) == succpos();
126 }
127 return false;
128 }
129
131
134 inline
136 {
137 return sort_pos::succpos()(arg0);
138 }
139
142
144 inline
146 {
147 make_application(result, sort_pos::succpos(),arg0);
148 }
149
154 inline
156 {
157 return is_application(e) && is_succpos_function_symbol(atermpp::down_cast<application>(e).head());
158 }
161 inline
163 {
165 result.push_back(sort_pos::c1());
166 result.push_back(sort_pos::succpos());
167
168 return result;
169 }
172 inline
174 {
176 result.push_back(sort_pos::c1());
177 result.push_back(sort_pos::succpos());
178
179 return result;
180 }
181 // The typedef is the sort that maps a function symbol to an function that rewrites it as well as a string of a function that can be used to implement it
182 typedef std::map<function_symbol,std::pair<std::function<void(data_expression&, const data_expression&)>, std::string> > implementation_map;
185 inline
187 {
188 implementation_map result;
189 return result;
190 }
191
194 inline
196 {
199 }
200
202
204 inline
206 {
209 }
210
214 inline
216 {
217 if (is_function_symbol(e))
218 {
219 return atermpp::down_cast<function_symbol>(e) == most_significant_digit();
220 }
221 return false;
222 }
223
225
228 inline
230 {
232 }
233
236
238 inline
240 {
242 }
243
248 inline
250 {
251 return is_application(e) && is_most_significant_digit_function_symbol(atermpp::down_cast<application>(e).head());
252 }
253
256 inline
258 {
260 return concat_digit_name;
261 }
262
264
266 inline
268 {
270 return concat_digit;
271 }
272
276 inline
278 {
279 if (is_function_symbol(e))
280 {
281 return atermpp::down_cast<function_symbol>(e) == concat_digit();
282 }
283 return false;
284 }
285
287
291 inline
293 {
294 return sort_pos::concat_digit()(arg0, arg1);
295 }
296
299
302 inline
304 {
306 }
307
312 inline
314 {
315 return is_application(e) && is_concat_digit_function_symbol(atermpp::down_cast<application>(e).head());
316 }
317
320 inline
322 {
324 return equals_one_name;
325 }
326
328
330 inline
332 {
334 return equals_one;
335 }
336
340 inline
342 {
343 if (is_function_symbol(e))
344 {
345 return atermpp::down_cast<function_symbol>(e) == equals_one();
346 }
347 return false;
348 }
349
351
354 inline
356 {
357 return sort_pos::equals_one()(arg0);
358 }
359
362
364 inline
366 {
368 }
369
374 inline
376 {
377 return is_application(e) && is_equals_one_function_symbol(atermpp::down_cast<application>(e).head());
378 }
379
382 inline
384 {
386 return maximum_name;
387 }
388
390
392 inline
393 const function_symbol& maximum()
394 {
395 static function_symbol maximum(maximum_name(), make_function_sort_(pos(), pos(), pos()));
396 return maximum;
397 }
398
402 inline
404 {
405 if (is_function_symbol(e))
406 {
407 return atermpp::down_cast<function_symbol>(e) == maximum();
408 }
409 return false;
410 }
411
413
417 inline
418 application maximum(const data_expression& arg0, const data_expression& arg1)
419 {
420 return sort_pos::maximum()(arg0, arg1);
421 }
422
425
428 inline
429 void make_maximum(data_expression& result, const data_expression& arg0, const data_expression& arg1)
430 {
431 make_application(result, sort_pos::maximum(),arg0, arg1);
432 }
433
438 inline
440 {
441 return is_application(e) && is_maximum_function_symbol(atermpp::down_cast<application>(e).head());
442 }
443
446 inline
448 {
450 return minimum_name;
451 }
452
454
456 inline
457 const function_symbol& minimum()
458 {
460 return minimum;
461 }
462
466 inline
468 {
469 if (is_function_symbol(e))
470 {
471 return atermpp::down_cast<function_symbol>(e) == minimum();
472 }
473 return false;
474 }
475
477
481 inline
482 application minimum(const data_expression& arg0, const data_expression& arg1)
483 {
484 return sort_pos::minimum()(arg0, arg1);
485 }
486
489
492 inline
493 void make_minimum(data_expression& result, const data_expression& arg0, const data_expression& arg1)
494 {
495 make_application(result, sort_pos::minimum(),arg0, arg1);
496 }
497
502 inline
504 {
505 return is_application(e) && is_minimum_function_symbol(atermpp::down_cast<application>(e).head());
506 }
507
510 inline
512 {
514 return succ_name;
515 }
516
518
520 inline
521 const function_symbol& succ()
522 {
524 return succ;
525 }
526
530 inline
532 {
533 if (is_function_symbol(e))
534 {
535 return atermpp::down_cast<function_symbol>(e) == succ();
536 }
537 return false;
538 }
539
541
544 inline
545 application succ(const data_expression& arg0)
546 {
547 return sort_pos::succ()(arg0);
548 }
549
552
554 inline
555 void make_succ(data_expression& result, const data_expression& arg0)
556 {
557 make_application(result, sort_pos::succ(),arg0);
558 }
559
564 inline
566 {
567 return is_application(e) && is_succ_function_symbol(atermpp::down_cast<application>(e).head());
568 }
569
572 inline
574 {
577 }
578
580
582 inline
584 {
586 return pos_predecessor;
587 }
588
592 inline
594 {
595 if (is_function_symbol(e))
596 {
597 return atermpp::down_cast<function_symbol>(e) == pos_predecessor();
598 }
599 return false;
600 }
601
603
606 inline
607 application pos_predecessor(const data_expression& arg0)
608 {
609 return sort_pos::pos_predecessor()(arg0);
610 }
611
614
616 inline
617 void make_pos_predecessor(data_expression& result, const data_expression& arg0)
618 {
620 }
621
626 inline
628 {
629 return is_application(e) && is_pos_predecessor_function_symbol(atermpp::down_cast<application>(e).head());
630 }
631
634 inline
636 {
638 return plus_name;
639 }
640
642
644 inline
645 const function_symbol& plus()
646 {
648 return plus;
649 }
650
654 inline
656 {
657 if (is_function_symbol(e))
658 {
659 return atermpp::down_cast<function_symbol>(e) == plus();
660 }
661 return false;
662 }
663
665
669 inline
670 application plus(const data_expression& arg0, const data_expression& arg1)
671 {
672 return sort_pos::plus()(arg0, arg1);
673 }
674
677
680 inline
681 void make_plus(data_expression& result, const data_expression& arg0, const data_expression& arg1)
682 {
683 make_application(result, sort_pos::plus(),arg0, arg1);
684 }
685
690 inline
692 {
693 return is_application(e) && is_plus_function_symbol(atermpp::down_cast<application>(e).head());
694 }
695
698 inline
700 {
702 return add_with_carry_name;
703 }
704
706
708 inline
710 {
712 return add_with_carry;
713 }
714
718 inline
720 {
721 if (is_function_symbol(e))
722 {
723 return atermpp::down_cast<function_symbol>(e) == add_with_carry();
724 }
725 return false;
726 }
727
729
733 inline
735 {
736 return sort_pos::add_with_carry()(arg0, arg1);
737 }
738
741
744 inline
746 {
748 }
749
754 inline
756 {
757 return is_application(e) && is_add_with_carry_function_symbol(atermpp::down_cast<application>(e).head());
758 }
759
762 inline
764 {
767 }
768
770
772 inline
774 {
776 return auxiliary_plus_pos;
777 }
778
782 inline
784 {
785 if (is_function_symbol(e))
786 {
787 return atermpp::down_cast<function_symbol>(e) == auxiliary_plus_pos();
788 }
789 return false;
790 }
791
793
797 inline
799 {
800 return sort_pos::auxiliary_plus_pos()(arg0, arg1);
801 }
802
805
808 inline
810 {
812 }
813
818 inline
820 {
821 return is_application(e) && is_auxiliary_plus_pos_function_symbol(atermpp::down_cast<application>(e).head());
822 }
823
826 inline
828 {
830 return times_name;
831 }
832
834
836 inline
837 const function_symbol& times()
838 {
839 static function_symbol times(times_name(), make_function_sort_(pos(), pos(), pos()));
840 return times;
841 }
842
846 inline
848 {
849 if (is_function_symbol(e))
850 {
851 return atermpp::down_cast<function_symbol>(e) == times();
852 }
853 return false;
854 }
855
857
861 inline
862 application times(const data_expression& arg0, const data_expression& arg1)
863 {
864 return sort_pos::times()(arg0, arg1);
865 }
866
869
872 inline
873 void make_times(data_expression& result, const data_expression& arg0, const data_expression& arg1)
874 {
875 make_application(result, sort_pos::times(),arg0, arg1);
876 }
877
882 inline
884 {
885 return is_application(e) && is_times_function_symbol(atermpp::down_cast<application>(e).head());
886 }
887
890 inline
892 {
894 return times_overflow_name;
895 }
896
898
900 inline
902 {
904 return times_overflow;
905 }
906
910 inline
912 {
913 if (is_function_symbol(e))
914 {
915 return atermpp::down_cast<function_symbol>(e) == times_overflow();
916 }
917 return false;
918 }
919
921
926 inline
928 {
929 return sort_pos::times_overflow()(arg0, arg1, arg2);
930 }
931
934
938 inline
940 {
942 }
943
948 inline
950 {
951 return is_application(e) && is_times_overflow_function_symbol(atermpp::down_cast<application>(e).head());
952 }
953
956 inline
958 {
960 return times_ordered_name;
961 }
962
964
966 inline
968 {
970 return times_ordered;
971 }
972
976 inline
978 {
979 if (is_function_symbol(e))
980 {
981 return atermpp::down_cast<function_symbol>(e) == times_ordered();
982 }
983 return false;
984 }
985
987
991 inline
993 {
994 return sort_pos::times_ordered()(arg0, arg1);
995 }
996
999
1002 inline
1004 {
1006 }
1007
1012 inline
1014 {
1015 return is_application(e) && is_times_ordered_function_symbol(atermpp::down_cast<application>(e).head());
1016 }
1017
1020 inline
1022 {
1025 }
1026
1028
1030 inline
1032 {
1035 }
1036
1040 inline
1042 {
1043 if (is_function_symbol(e))
1044 {
1045 return atermpp::down_cast<function_symbol>(e) == times_whr_mult_overflow();
1046 }
1047 return false;
1048 }
1049
1051
1055 inline
1057 {
1059 }
1060
1063
1066 inline
1068 {
1070 }
1071
1076 inline
1078 {
1079 return is_application(e) && is_times_whr_mult_overflow_function_symbol(atermpp::down_cast<application>(e).head());
1080 }
1083 inline
1085 {
1087 result.push_back(sort_pos::most_significant_digit());
1088 result.push_back(sort_pos::concat_digit());
1089 result.push_back(sort_pos::equals_one());
1090 result.push_back(sort_pos::maximum());
1091 result.push_back(sort_pos::minimum());
1092 result.push_back(sort_pos::succ());
1093 result.push_back(sort_pos::pos_predecessor());
1094 result.push_back(sort_pos::plus());
1095 result.push_back(sort_pos::add_with_carry());
1096 result.push_back(sort_pos::auxiliary_plus_pos());
1097 result.push_back(sort_pos::times());
1098 result.push_back(sort_pos::times_overflow());
1099 result.push_back(sort_pos::times_ordered());
1100 result.push_back(sort_pos::times_whr_mult_overflow());
1101 return result;
1102 }
1103
1106 inline
1108 {
1110 for(const function_symbol& f: pos_generate_constructors_code())
1111 {
1112 result.push_back(f);
1113 }
1114 return result;
1115 }
1116
1119 inline
1121 {
1123 result.push_back(sort_pos::most_significant_digit());
1124 result.push_back(sort_pos::concat_digit());
1125 result.push_back(sort_pos::equals_one());
1126 result.push_back(sort_pos::maximum());
1127 result.push_back(sort_pos::minimum());
1128 result.push_back(sort_pos::succ());
1129 result.push_back(sort_pos::pos_predecessor());
1130 result.push_back(sort_pos::plus());
1131 result.push_back(sort_pos::add_with_carry());
1132 result.push_back(sort_pos::auxiliary_plus_pos());
1133 result.push_back(sort_pos::times());
1134 result.push_back(sort_pos::times_overflow());
1135 result.push_back(sort_pos::times_ordered());
1136 result.push_back(sort_pos::times_whr_mult_overflow());
1137 return result;
1138 }
1139
1140
1141 // The typedef is the sort that maps a function symbol to an function that rewrites it as well as a string of a function that can be used to implement it
1142 typedef std::map<function_symbol,std::pair<std::function<void(data_expression&, const data_expression&)>, std::string> > implementation_map;
1145 inline
1147 {
1148 implementation_map result;
1149 return result;
1150 }
1156 inline
1157 const data_expression& arg(const data_expression& e)
1158 {
1160 return atermpp::down_cast<application>(e)[0];
1161 }
1162
1168 inline
1169 const data_expression& arg1(const data_expression& e)
1170 {
1172 return atermpp::down_cast<application>(e)[0];
1173 }
1174
1180 inline
1181 const data_expression& arg2(const data_expression& e)
1182 {
1184 return atermpp::down_cast<application>(e)[1];
1185 }
1186
1192 inline
1193 const data_expression& left(const data_expression& e)
1194 {
1196 return atermpp::down_cast<application>(e)[0];
1197 }
1198
1204 inline
1205 const data_expression& right(const data_expression& e)
1206 {
1208 return atermpp::down_cast<application>(e)[1];
1209 }
1210
1216 inline
1217 const data_expression& arg3(const data_expression& e)
1218 {
1220 return atermpp::down_cast<application>(e)[2];
1221 }
1222
1225 inline
1227 {
1228 variable vb("b",sort_bool::bool_());
1229 variable vp("p",pos());
1230 variable vp1("p1",pos());
1231 variable vp2("p2",pos());
1232 variable vw("w",sort_machine_word::machine_word());
1233 variable vw1("w1",sort_machine_word::machine_word());
1234 variable vw2("w2",sort_machine_word::machine_word());
1235 variable voverflow("overflow",sort_machine_word::machine_word());
1236
1237 data_equation_vector result;
1238 result.push_back(data_equation(variable_list(), c1(), most_significant_digit(sort_machine_word::one_word())));
1239 result.push_back(data_equation(variable_list({vw}), equals_one(most_significant_digit(vw)), sort_machine_word::equals_one_word(vw)));
1240 result.push_back(data_equation(variable_list({vp, vw}), equals_one(concat_digit(vp, vw)), sort_bool::false_()));
1241 result.push_back(data_equation(variable_list({vp}), succ(vp), succpos(vp)));
1244 result.push_back(data_equation(variable_list({vw1, vw2}), equal_to(most_significant_digit(vw1), most_significant_digit(vw2)), sort_machine_word::equal_word(vw1, vw2)));
1245 result.push_back(data_equation(variable_list({vp, vw1, vw2}), equal_to(concat_digit(vp, vw1), most_significant_digit(vw2)), sort_bool::false_()));
1246 result.push_back(data_equation(variable_list({vp, vw1, vw2}), equal_to(most_significant_digit(vw1), concat_digit(vp, vw2)), sort_bool::false_()));
1247 result.push_back(data_equation(variable_list({vp1, vp2, vw1, vw2}), equal_to(concat_digit(vp1, vw1), concat_digit(vp2, vw2)), sort_bool::and_(sort_machine_word::equal_word(vw1, vw2), equal_to(vp1, vp2))));
1248 result.push_back(data_equation(variable_list({vp1, vp2}), equal_to(succpos(vp1), vp2), sort_bool::and_(sort_bool::not_(equals_one(vp2)), equal_to(vp1, pos_predecessor(vp2)))));
1249 result.push_back(data_equation(variable_list({vp1, vp2}), equal_to(vp1, succpos(vp2)), sort_bool::and_(sort_bool::not_(equals_one(vp1)), equal_to(pos_predecessor(vp1), vp2))));
1250 result.push_back(data_equation(variable_list({vw1, vw2}), less(most_significant_digit(vw1), most_significant_digit(vw2)), sort_machine_word::less_word(vw1, vw2)));
1251 result.push_back(data_equation(variable_list({vp, vw1, vw2}), less(concat_digit(vp, vw1), most_significant_digit(vw2)), sort_bool::false_()));
1252 result.push_back(data_equation(variable_list({vp, vw1, vw2}), less(most_significant_digit(vw1), concat_digit(vp, vw2)), sort_bool::true_()));
1253 result.push_back(data_equation(variable_list({vp1, vp2, vw1, vw2}), less(concat_digit(vp1, vw1), concat_digit(vp2, vw2)), if_(sort_machine_word::less_word(vw1, vw2), less_equal(vp1, vp2), less(vp1, vp2))));
1254 result.push_back(data_equation(variable_list({vp1, vp2}), less(succpos(vp1), vp2), sort_bool::and_(less(most_significant_digit(sort_machine_word::two_word()), vp2), less(vp1, pos_predecessor(vp2)))));
1255 result.push_back(data_equation(variable_list({vp1, vp2}), less(vp1, succpos(vp2)), less_equal(vp1, vp2)));
1256 result.push_back(data_equation(variable_list({vp, vw1}), sort_machine_word::equals_one_word(vw1), less(vp, most_significant_digit(vw1)), sort_bool::false_()));
1257 result.push_back(data_equation(variable_list({vw1, vw2}), less_equal(most_significant_digit(vw1), most_significant_digit(vw2)), sort_machine_word::less_equal_word(vw1, vw2)));
1258 result.push_back(data_equation(variable_list({vp, vw1, vw2}), less_equal(concat_digit(vp, vw1), most_significant_digit(vw2)), sort_bool::false_()));
1259 result.push_back(data_equation(variable_list({vp, vw1, vw2}), less_equal(most_significant_digit(vw1), concat_digit(vp, vw2)), sort_bool::true_()));
1260 result.push_back(data_equation(variable_list({vp1, vp2, vw1, vw2}), less_equal(concat_digit(vp1, vw1), concat_digit(vp2, vw2)), if_(sort_machine_word::less_equal_word(vw1, vw2), less_equal(vp1, vp2), less(vp1, vp2))));
1261 result.push_back(data_equation(variable_list({vp1, vp2}), less_equal(succpos(vp1), vp2), less(vp1, vp2)));
1262 result.push_back(data_equation(variable_list({vp1, vp2}), less_equal(vp1, succpos(vp2)), sort_bool::or_(equals_one(vp1), less_equal(pos_predecessor(vp1), vp2))));
1263 result.push_back(data_equation(variable_list({vp, vw1}), sort_machine_word::equals_one_word(vw1), less_equal(most_significant_digit(vw1), vp), sort_bool::true_()));
1264 result.push_back(data_equation(variable_list({vp1, vp2}), maximum(vp1, vp2), if_(less_equal(vp1, vp2), vp2, vp1)));
1265 result.push_back(data_equation(variable_list({vp1, vp2}), minimum(vp1, vp2), if_(less_equal(vp1, vp2), vp1, vp2)));
1268 result.push_back(data_equation(variable_list({vp}), pos_predecessor(succpos(vp)), vp));
1271 result.push_back(data_equation(variable_list({vp1, vw1, vw2}), plus(concat_digit(vp1, vw1), most_significant_digit(vw2)), if_(sort_machine_word::add_overflow_word(vw1, vw2), concat_digit(succpos(vp1), sort_machine_word::add_word(vw1, vw2)), concat_digit(vp1, sort_machine_word::add_word(vw1, vw2)))));
1273 result.push_back(data_equation(variable_list({vp2, vw1, vw2}), plus(most_significant_digit(vw1), concat_digit(vp2, vw2)), if_(sort_machine_word::add_overflow_word(vw1, vw2), concat_digit(succpos(vp2), sort_machine_word::add_word(vw1, vw2)), concat_digit(vp2, sort_machine_word::add_word(vw1, vw2)))));
1275 result.push_back(data_equation(variable_list({vp1, vp2, vw1, vw2}), plus(concat_digit(vp1, vw1), concat_digit(vp2, vw2)), if_(sort_machine_word::add_overflow_word(vw1, vw2), concat_digit(add_with_carry(vp1, vp2), sort_machine_word::add_word(vw1, vw2)), concat_digit(plus(vp1, vp2), sort_machine_word::add_word(vw1, vw2)))));
1276 result.push_back(data_equation(variable_list({vp1, vp2, vw1, vw2}), add_with_carry(concat_digit(vp1, vw1), concat_digit(vp2, vw2)), if_(sort_machine_word::add_with_carry_overflow_word(vw1, vw2), concat_digit(add_with_carry(vp1, vp2), sort_machine_word::add_with_carry_word(vw1, vw2)), concat_digit(plus(vp1, vp2), sort_machine_word::add_with_carry_word(vw1, vw2)))));
1277 result.push_back(data_equation(variable_list({vp1, vp2}), plus(succpos(vp1), vp2), succpos(plus(vp1, vp2))));
1278 result.push_back(data_equation(variable_list({vp1, vp2}), plus(vp1, succpos(vp2)), succpos(plus(vp1, vp2))));
1279 result.push_back(data_equation(variable_list({vp1, vp2}), auxiliary_plus_pos(vp1, vp2), plus(vp1, vp2)));
1281 result.push_back(data_equation(variable_list({vp2, vw1, vw2}), times(most_significant_digit(vw1), concat_digit(vp2, vw2)), concat_digit(times_overflow(vp2, vw1, sort_machine_word::times_overflow_word(vw1, vw2)), sort_machine_word::times_word(vw1, vw2))));
1282 result.push_back(data_equation(variable_list({vp1, vw1, vw2}), times(concat_digit(vp1, vw1), most_significant_digit(vw2)), concat_digit(times_overflow(vp1, vw2, sort_machine_word::times_overflow_word(vw1, vw2)), sort_machine_word::times_word(vw1, vw2))));
1283 result.push_back(data_equation(variable_list({vp1, vp2, vw1, vw2}), times(concat_digit(vp1, vw1), concat_digit(vp2, vw2)), if_(less(vp1, vp2), times_ordered(concat_digit(vp1, vw1), concat_digit(vp2, vw2)), times_ordered(concat_digit(vp2, vw2), concat_digit(vp1, vw1)))));
1284 result.push_back(data_equation(variable_list({vp2, vw1, vw2}), times_ordered(most_significant_digit(vw1), concat_digit(vp2, vw2)), concat_digit(times_overflow(vp2, vw1, sort_machine_word::times_overflow_word(vw1, vw2)), sort_machine_word::times_word(vw1, vw2))));
1285 result.push_back(data_equation(variable_list({vp1, vp2, vw1}), times_ordered(concat_digit(vp1, vw1), vp2), plus(concat_digit(times_ordered(vp1, vp2), sort_machine_word::zero_word()), times_overflow(vp2, vw1, sort_machine_word::zero_word()))));
1286 result.push_back(data_equation(variable_list({vw1, vw2}), times_whr_mult_overflow(vw1, vw2), if_(sort_machine_word::equals_zero_word(vw2), most_significant_digit(vw1), concat_digit(most_significant_digit(vw2), vw1))));
1287 result.push_back(data_equation(variable_list({voverflow, vw1, vw2}), times_overflow(most_significant_digit(vw1), vw2, voverflow), times_whr_mult_overflow(sort_machine_word::times_with_carry_word(vw1, vw2, voverflow), sort_machine_word::times_with_carry_overflow_word(vw1, vw2, voverflow))));
1288 result.push_back(data_equation(variable_list({voverflow, vp1, vw1, vw2}), times_overflow(concat_digit(vp1, vw1), vw2, voverflow), concat_digit(times_overflow(vp1, vw2, sort_machine_word::times_with_carry_overflow_word(vw1, vw2, voverflow)), sort_machine_word::times_with_carry_word(vw1, vw2, voverflow))));
1289 return result;
1290 }
1291
1292 } // namespace sort_pos
1293
1294 } // namespace data
1295
1296} // namespace mcrl2
1297
1298#endif // MCRL2_DATA_POS64_H
The class application.
The class basic_sort.
The standard sort bool_.
Term containing a string.
An application of a data expression to a number of arguments.
\brief A function symbol
The class function symbol.
The class data_equation.
Exception classes for use in libraries and tools.
The class function_sort.
The standard sort machine_word.
atermpp::aterm_string identifier_string
String type of the LPS library. Identifier strings are represented internally as ATerms.
const basic_sort & bool_()
Constructor for sort expression Bool.
Definition bool.h:44
const function_symbol & and_()
Constructor for function symbol &&.
Definition bool.h:235
const function_symbol & false_()
Constructor for function symbol false.
Definition bool.h:109
const function_symbol & or_()
Constructor for function symbol ||.
Definition bool.h:299
const function_symbol & not_()
Constructor for function symbol !.
Definition bool.h:173
const function_symbol & true_()
Constructor for function symbol true.
Definition bool.h:77
function_symbol head(const sort_expression &s)
Constructor for function symbol head.
Definition list1.h:526
const function_symbol & add_word()
Constructor for function symbol @add_word.
const function_symbol & pred_word()
Constructor for function symbol @pred_word.
const function_symbol & equals_max_word()
Constructor for function symbol @equals_max_word.
const function_symbol & equals_one_word()
Constructor for function symbol @equals_one_word.
const function_symbol & succ_word()
Constructor for function symbol @succ_word.
const function_symbol & less_word()
Constructor for function symbol @less.
const basic_sort & machine_word()
Constructor for sort expression @word.
const function_symbol & add_with_carry_word()
Constructor for function symbol @add_with_carry_word.
const function_symbol & equals_zero_word()
Constructor for function symbol @equals_zero_word.
const function_symbol & one_word()
Constructor for function symbol @one_word.
const function_symbol & max_word()
Constructor for function symbol @max_word.
const function_symbol & add_with_carry_overflow_word()
Constructor for function symbol @add_with_carry_overflow_word.
const function_symbol & times_with_carry_word()
Constructor for function symbol @times_with_carry_word.
const function_symbol & times_with_carry_overflow_word()
Constructor for function symbol @times_with_carry_overflow_word.
const function_symbol & times_overflow_word()
Constructor for function symbol @times_overflow_word.
const function_symbol & zero_word()
Constructor for function symbol @zero_word.
const function_symbol & equal_word()
Constructor for function symbol @equal.
const function_symbol & less_equal_word()
Constructor for function symbol @less_equal.
const function_symbol & times_word()
Constructor for function symbol @times_word.
const function_symbol & two_word()
Constructor for function symbol @two_word.
const function_symbol & add_overflow_word()
Constructor for function symbol @add_overflow_word.
const core::identifier_string & equals_one_name()
Generate identifier @equals_one.
Definition pos64.h:321
bool is_pos_predecessor_function_symbol(const atermpp::aterm &e)
Recogniser for function @pospred.
Definition pos1.h:406
const core::identifier_string & concat_digit_name()
Generate identifier @concat_digit.
Definition pos64.h:257
bool is_add_with_carry_function_symbol(const atermpp::aterm &e)
Recogniser for function @addc.
Definition pos1.h:532
void make_equals_one(data_expression &result, const data_expression &arg0)
Make an application of function symbol @equals_one.
Definition pos64.h:365
const function_symbol & times_overflow()
Constructor for function symbol @times_overflow.
Definition pos64.h:901
bool is_auxiliary_plus_pos_application(const atermpp::aterm &e)
Recogniser for application of @plus_pos.
Definition pos64.h:819
const function_symbol & equals_one()
Constructor for function symbol @equals_one.
Definition pos64.h:331
const data_expression & arg(const data_expression &e)
Function for projecting out argument. arg from an application.
Definition pos1.h:788
void make_most_significant_digit(data_expression &result, const data_expression &arg0)
Make an application of function symbol @most_significant_digit.
Definition pos64.h:239
void make_add_with_carry(data_expression &result, const data_expression &arg0, const data_expression &arg1, const data_expression &arg2)
Make an application of function symbol @addc.
Definition pos1.h:560
void make_times(data_expression &result, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol *.
Definition pos1.h:624
const function_symbol & times_ordered()
Constructor for function symbol @times_ordered.
Definition pos64.h:967
bool is_times_overflow_function_symbol(const atermpp::aterm &e)
Recogniser for function @times_overflow.
Definition pos64.h:911
bool is_maximum_function_symbol(const atermpp::aterm &e)
Recogniser for function max.
Definition pos1.h:216
const core::identifier_string & times_whr_mult_overflow_name()
Generate identifier @times_whr_mult_overflow.
Definition pos64.h:1021
bool is_times_ordered_function_symbol(const atermpp::aterm &e)
Recogniser for function @times_ordered.
Definition pos64.h:977
implementation_map pos_cpp_implementable_mappings()
Give all system defined mappings that are to be implemented in C++ code for pos.
Definition pos1.h:753
void make_auxiliary_plus_pos(data_expression &result, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol @plus_pos.
Definition pos64.h:809
void make_maximum(data_expression &result, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol max.
Definition pos1.h:242
bool is_pos(const sort_expression &e)
Recogniser for sort expression Pos.
Definition pos1.h:55
bool is_times_ordered_application(const atermpp::aterm &e)
Recogniser for application of @times_ordered.
Definition pos64.h:1013
const data_expression & arg3(const data_expression &e)
Function for projecting out argument. arg3 from an application.
Definition pos1.h:824
bool is_succpos_application(const atermpp::aterm &e)
Recogniser for application of @succ_pos.
Definition pos64.h:155
const function_symbol & auxiliary_plus_pos()
Constructor for function symbol @plus_pos.
Definition pos64.h:773
const function_symbol & c1()
Constructor for function symbol @c1.
Definition pos1.h:78
void make_times_whr_mult_overflow(data_expression &result, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol @times_whr_mult_overflow.
Definition pos64.h:1067
void make_succ(data_expression &result, const data_expression &arg0)
Make an application of function symbol succ.
Definition pos1.h:368
const function_symbol & add_with_carry()
Constructor for function symbol @addc.
Definition pos1.h:522
const data_expression & arg1(const data_expression &e)
Function for projecting out argument. arg1 from an application.
Definition pos1.h:800
bool is_times_whr_mult_overflow_function_symbol(const atermpp::aterm &e)
Recogniser for function @times_whr_mult_overflow.
Definition pos64.h:1041
const core::identifier_string & times_overflow_name()
Generate identifier @times_overflow.
Definition pos64.h:891
void make_minimum(data_expression &result, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol min.
Definition pos1.h:306
function_symbol_vector pos_generate_functions_code()
Give all system defined mappings for pos.
Definition pos1.h:703
void make_times_overflow(data_expression &result, const data_expression &arg0, const data_expression &arg1, const data_expression &arg2)
Make an application of function symbol @times_overflow.
Definition pos64.h:939
bool is_times_whr_mult_overflow_application(const atermpp::aterm &e)
Recogniser for application of @times_whr_mult_overflow.
Definition pos64.h:1077
const function_symbol & pos_predecessor()
Constructor for function symbol @pospred.
Definition pos1.h:396
bool is_auxiliary_plus_pos_function_symbol(const atermpp::aterm &e)
Recogniser for function @plus_pos.
Definition pos64.h:783
const core::identifier_string & c1_name()
Generate identifier @c1.
Definition pos1.h:68
const function_symbol & plus()
Constructor for function symbol +.
Definition pos1.h:458
bool is_add_with_carry_application(const atermpp::aterm &e)
Recogniser for application of @addc.
Definition pos1.h:570
const function_symbol & maximum()
Constructor for function symbol max.
Definition pos1.h:206
const core::identifier_string & times_name()
Generate identifier *.
Definition pos1.h:578
bool is_most_significant_digit_function_symbol(const atermpp::aterm &e)
Recogniser for function @most_significant_digit.
Definition pos64.h:215
function_symbol_vector pos_mCRL2_usable_constructors()
Give all defined constructors which can be used in mCRL2 specs for pos.
Definition pos1.h:174
bool is_c1_function_symbol(const atermpp::aterm &e)
Recogniser for function @c1.
Definition pos1.h:88
const data_expression & arg2(const data_expression &e)
Function for projecting out argument. arg2 from an application.
Definition pos1.h:812
const core::identifier_string & plus_name()
Generate identifier +.
Definition pos1.h:448
const function_symbol & succpos()
Constructor for function symbol @succ_pos.
Definition pos64.h:111
bool is_minimum_function_symbol(const atermpp::aterm &e)
Recogniser for function min.
Definition pos1.h:280
const core::identifier_string & times_ordered_name()
Generate identifier @times_ordered.
Definition pos64.h:957
const function_symbol & times_whr_mult_overflow()
Constructor for function symbol @times_whr_mult_overflow.
Definition pos64.h:1031
const data_expression & right(const data_expression &e)
Function for projecting out argument. right from an application.
Definition pos1.h:776
implementation_map pos_cpp_implementable_constructors()
Give all system defined constructors which have an implementation in C++ and not in rewrite rules for...
Definition pos1.h:187
bool is_times_application(const atermpp::aterm &e)
Recogniser for application of *.
Definition pos1.h:634
const function_symbol & concat_digit()
Constructor for function symbol @concat_digit.
Definition pos64.h:267
bool is_most_significant_digit_application(const atermpp::aterm &e)
Recogniser for application of @most_significant_digit.
Definition pos64.h:249
bool is_times_function_symbol(const atermpp::aterm &e)
Recogniser for function *.
Definition pos1.h:598
void make_plus(data_expression &result, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol +.
Definition pos1.h:494
const core::identifier_string & add_with_carry_name()
Generate identifier @addc.
Definition pos1.h:512
void make_succpos(data_expression &result, const data_expression &arg0)
Make an application of function symbol @succ_pos.
Definition pos64.h:145
const function_symbol & times()
Constructor for function symbol *.
Definition pos1.h:588
bool is_succpos_function_symbol(const atermpp::aterm &e)
Recogniser for function @succ_pos.
Definition pos64.h:121
bool is_succ_function_symbol(const atermpp::aterm &e)
Recogniser for function succ.
Definition pos1.h:344
bool is_plus_function_symbol(const atermpp::aterm &e)
Recogniser for function +.
Definition pos1.h:468
bool is_concat_digit_application(const atermpp::aterm &e)
Recogniser for application of @concat_digit.
Definition pos64.h:313
const core::identifier_string & auxiliary_plus_pos_name()
Generate identifier @plus_pos.
Definition pos64.h:763
bool is_times_overflow_application(const atermpp::aterm &e)
Recogniser for application of @times_overflow.
Definition pos64.h:949
const core::identifier_string & minimum_name()
Generate identifier min.
Definition pos1.h:260
bool is_minimum_application(const atermpp::aterm &e)
Recogniser for application of min.
Definition pos1.h:316
data_equation_vector pos_generate_equations_code()
Give all system defined equations for pos.
Definition pos1.h:833
const function_symbol & most_significant_digit()
Constructor for function symbol @most_significant_digit.
Definition pos64.h:205
bool is_succ_application(const atermpp::aterm &e)
Recogniser for application of succ.
Definition pos1.h:378
void make_times_ordered(data_expression &result, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol @times_ordered.
Definition pos64.h:1003
bool is_equals_one_application(const atermpp::aterm &e)
Recogniser for application of @equals_one.
Definition pos64.h:375
const basic_sort & pos()
Constructor for sort expression Pos.
Definition pos1.h:45
const core::identifier_string & maximum_name()
Generate identifier max.
Definition pos1.h:196
const core::identifier_string & pos_name()
Definition pos1.h:36
const function_symbol & minimum()
Constructor for function symbol min.
Definition pos1.h:270
const data_expression & left(const data_expression &e)
Function for projecting out argument. left from an application.
Definition pos1.h:764
function_symbol_vector pos_generate_constructors_and_functions_code()
Give all system defined mappings and constructors for pos.
Definition pos1.h:720
function_symbol_vector pos_generate_constructors_code()
Give all system defined constructors for pos.
Definition pos1.h:163
bool is_concat_digit_function_symbol(const atermpp::aterm &e)
Recogniser for function @concat_digit.
Definition pos64.h:277
bool is_maximum_application(const atermpp::aterm &e)
Recogniser for application of max.
Definition pos1.h:252
bool is_equals_one_function_symbol(const atermpp::aterm &e)
Recogniser for function @equals_one.
Definition pos64.h:341
const core::identifier_string & succpos_name()
Generate identifier @succ_pos.
Definition pos64.h:101
bool is_pos_predecessor_application(const atermpp::aterm &e)
Recogniser for application of @pospred.
Definition pos1.h:440
std::map< function_symbol, std::pair< std::function< void(data_expression &, const data_expression &)>, std::string > > implementation_map
Definition pos1.h:183
bool is_plus_application(const atermpp::aterm &e)
Recogniser for application of +.
Definition pos1.h:504
const function_symbol & succ()
Constructor for function symbol succ.
Definition pos1.h:334
const core::identifier_string & pos_predecessor_name()
Generate identifier @pospred.
Definition pos1.h:386
void make_concat_digit(data_expression &result, const data_expression &arg0, const data_expression &arg1)
Make an application of function symbol @concat_digit.
Definition pos64.h:303
function_symbol_vector pos_mCRL2_usable_mappings()
Give all system defined mappings that can be used in mCRL2 specs for pos.
Definition pos1.h:733
const core::identifier_string & succ_name()
Generate identifier succ.
Definition pos1.h:324
const core::identifier_string & most_significant_digit_name()
Generate identifier @most_significant_digit.
Definition pos64.h:195
void make_pos_predecessor(data_expression &result, const data_expression &arg0)
Make an application of function symbol @pospred.
Definition pos1.h:430
function_symbol less_equal(const sort_expression &s)
Constructor for function symbol <=.
Definition standard.h:277
function_symbol less(const sort_expression &s)
Constructor for function symbol <.
Definition standard.h:240
std::vector< data_equation > data_equation_vector
\brief vector of data_equations
function_sort make_function_sort_(const sort_expression &dom1, const sort_expression &codomain)
Convenience constructor for function sort with domain size 1.
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.
atermpp::term_list< variable > variable_list
\brief list of variables
function_symbol equal_to(const sort_expression &s)
Constructor for function symbol ==.
Definition standard.h:126
bool is_application(const atermpp::aterm &x)
Returns true if the term t is an application.
std::vector< function_symbol > function_symbol_vector
\brief vector of function_symbols
function_symbol if_(const sort_expression &s)
Constructor for function symbol if.
Definition standard.h:200
void make_application(atermpp::aterm &result)
Make function for an application.
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
Definition indexed_set.h:72
Standard functions that are available for all sorts.