16#ifndef MCRL2_DATA_LINEAR_INEQUALITY_H
17#define MCRL2_DATA_LINEAR_INEQUALITY_H
19#include "mcrl2/data/rewriter.h"
20#include "mcrl2/data/substitutions/map_substitution.h"
46 return application(times_f,arg0,arg1);
53 return application(plus_f,arg0,arg1);
60 return application(divides_f,arg0,arg1);
67 return application(minus_f,arg0,arg1);
74 return application(negate_f,arg);
81 return application(abs_f,arg);
121 case detail::less:
return "<";
122 case detail::less_eq:
return "<=";
123 case detail::equal:
return "==";
188 template <
class ITERATOR>
189 lhs_t(
const ITERATOR begin,
const ITERATOR end)
194 template <
class ITERATOR,
class TRANSFORMER>
195 lhs_t(
const ITERATOR begin,
const ITERATOR end, TRANSFORMER f)
202 return std::find_if(begin(),
211 std::vector <variable_with_a_rational_factor> result;
212 for(
const variable_with_a_rational_factor& p: *
this)
214 if (p.variable_name()!=v)
219 return lhs_t(result.begin(),result.end());
225 lhs_t::const_iterator i=find(v);
236 lhs_t::const_iterator i=find(v);
245 template <
typename SubstitutionFunction>
249 bool result_defined=
false;
250 for (
const variable_with_a_rational_factor& p: *
this)
254 result=rewrite_with_memory(real_plus(result,real_times(beta(p.variable_name()),p.factor())), r);
258 result=rewrite_with_memory(real_times(beta(p.variable_name()),p.factor()), r);
275 for(
const variable_with_a_rational_factor& p: *
this)
277 if (result==real_zero())
279 result=p.transform_to_data_expression();
283 result=real_plus(result,p.transform_to_data_expression());
295 detail::map_based_lhs_t::iterator i=new_lhs.find(x);
296 if (i!=new_lhs.end())
311 std::vector<variable_with_a_rational_factor> result;
312 for(
const variable_with_a_rational_factor& p: lhs)
314 if (!inserted && x<=p.variable_name())
316 result.emplace_back(x,e);
318 if (x!=p.variable_name())
320 result.emplace_back(p.variable_name(),p.factor());
323 else result.emplace_back(p.variable_name(),p.factor());
327 result.emplace_back(x,e);
329 assert(std::find(result.begin(),result.end(),variable_with_a_rational_factor(x,e))!=result.end());
330 return lhs_t(result.begin(),result.end());
336 for(map_based_lhs_t::const_reverse_iterator i=lhs.rbegin(); i!=lhs.rend(); ++i)
338 result.push_front(variable_with_a_rational_factor(i->first,i->second));
347 for(map_based_lhs_t::const_reverse_iterator i=lhs.rbegin(); i!=lhs.rend(); ++i)
349 result.push_front(variable_with_a_rational_factor(i->first, rewrite_with_memory(real_divides(i->second,factor), r)));
364 variable last_variable_seen=lhs.front().variable_name();
366 for(
const variable_with_a_rational_factor& p: lhs)
371 if (p.variable_name()<=last_variable_seen)
375 last_variable_seen=p.variable_name();
383 std::vector <variable_with_a_rational_factor> result;
384 for(
const variable_with_a_rational_factor& p: lhs)
386 if (p.variable_name()!=v)
388 result.emplace_back(p.variable_name(),rewrite_with_memory(real_divides(p.factor(),f), r));
391 return lhs_t(result.begin(),result.end());
406 std::vector<detail::variable_with_a_rational_factor> result;
407 result.reserve(argument.size());
408 for (
const detail::variable_with_a_rational_factor& p: argument)
410 emplace_back_if_not_zero(result,p.variable_name(), rewrite_with_memory(Operation(v,p.factor()),r));
412 return lhs_t(result.begin(),result.end());
417 template <
class OPERATION>
419 const lhs_t& argument2,
423 std::vector<detail::variable_with_a_rational_factor> result;
424 result.reserve(argument1.size()+argument2.size());
426 lhs_t::const_iterator i1=argument1.begin();
427 lhs_t::const_iterator i2=argument2.begin();
429 while (i1!=argument1.end() && i2!=argument2.end())
431 if (i1->variable_name()<i2->variable_name())
433 emplace_back_if_not_zero(result,i1->variable_name(), rewrite_with_memory(operation(i1->factor(),real_zero()),r));
436 else if (i1->variable_name()>i2->variable_name())
438 emplace_back_if_not_zero(result,i2->variable_name(), rewrite_with_memory(operation(real_zero(),i2->factor()),r));
443 assert(i1->variable_name()==i2->variable_name());
444 emplace_back_if_not_zero(result,i1->variable_name(), rewrite_with_memory(operation(i1->factor(),i2->factor()),r));
450 if (i1==argument1.end())
452 while (i2!=argument2.end())
454 emplace_back_if_not_zero(result,i2->variable_name(), rewrite_with_memory(operation(real_zero(),i2->factor()),r));
460 while (i1!=argument1.end())
462 emplace_back_if_not_zero(result,i1->variable_name(), rewrite_with_memory(operation(i1->factor(),real_zero()),r));
466 return lhs_t(result.begin(),result.end());
471 return meta_operation_constant<
real_plus>(argument,v,r);
476 return meta_operation_constant<
real_minus>(argument, v, r);
481 return meta_operation_constant<
real_times>(argument, v, r);
486 return meta_operation_constant<
real_divides>(argument, v, r);
491 return meta_operation_lhs(argument,
500 return meta_operation_lhs(argument,
510 if (lhs.begin()==lhs.end())
514 for (lhs_t::const_iterator i=lhs.begin(); i!=lhs.end(); ++i)
516 s=s + (i==lhs.begin()?
"":
" + ") ;
518 if (i->factor()==real_one())
520 s=s + pp(i->variable_name());
522 else if (i->factor()==real_minus_one())
524 s=s +
"-" + pp(i->variable_name());
528 s=s + data::pp(i->factor()) +
"*" + data::pp(i->variable_name());
572 const bool negate =
false,
603 throw mcrl2::
runtime_error(
"Expect constant multiplies expression: " +
pp(e
) +
"\n");
611 throw mcrl2::
runtime_error(
"Encountered a variable in a real expression which is not of sort real: " +
pp(e
) +
"\n");
613 const detail::map_based_lhs_t::const_iterator var_factor = new_lhs.find(v);
616 const data_expression new_factor(var_factor == new_lhs.end() ? neg_factor : real_plus(var_factor->second, neg_factor));
631 throw mcrl2::
runtime_error(
"Expect linear expression over reals: " +
pp(e
) +
"\n");
679 const bool negate=
false)
728 if (is_equal_to_application(e))
732 else if (is_less_application(e))
736 else if (is_less_equal_application(e))
740 else if (is_greater_application(e))
745 else if (is_greater_equal_application(e))
752 throw mcrl2::
runtime_error(
"Unexpected equality or inequality: " +
pp(e
) +
"\n") ;
764 return lhs().begin();
818 return lhs().empty() &&
825 return lhs().empty() &&
839 if (lhs_begin()==lhs_end())
849 for (detail::lhs_t::const_iterator i=lhs_begin(); i!=lhs_end(); ++i)
851 variable v=i->variable_name();
852 data_expression e=real_times(rewrite_with_memory(real_divides(i->factor(),factor),r),
860 lhs_expression=real_plus(lhs_expression,e);
902 for (detail::lhs_t::const_iterator i=lhs().begin(); i!=lhs().end(); ++i)
904 variable_set.insert(i->variable_name());
950 return real_minus_one;
986 std::set < variable > s=find_all_variables(e);
1001 throw mcrl2::
runtime_error(
"Cannot determine that " +
pp(e
) +
" is smaller than 0");
1015 throw mcrl2::
runtime_error(
"Cannot determine that " +
pp(e
) +
" is larger than or equal to 0");
1026template <
class TYPE>
1033 s=s+ (first?
"":
", ") +
pp(l
);
1041 const std::vector < linear_inequality >& inequalities_in,
1043 const bool use_cache=
true);
1049 const std::vector < linear_inequality >& inequalities,
1050 std::map < variable, std::size_t>& nr_positive_occurrences,
1051 std::map < variable, std::size_t>& nr_negative_occurrences,
1054 for (std::vector < linear_inequality >::const_iterator i=inequalities.begin();
1055 i!=inequalities.end(); ++i)
1057 for (detail::lhs_t::const_iterator j=i->lhs_begin(); j!=i->lhs_end(); ++j)
1059 if (is_positive(j->factor(),r))
1061 nr_positive_occurrences[j->variable_name()]=nr_positive_occurrences[j->variable_name()]+1;
1065 nr_negative_occurrences[j->variable_name()]=nr_negative_occurrences[j->variable_name()]+1;
1071template <
class Variable_iterator >
1093 const std::vector < linear_inequality >& inequalities,
1094 const std::vector < linear_inequality > :: iterator i,
1100 for (std::vector < linear_inequality >:: const_iterator j=inequalities.begin() ;
1101 j!=inequalities.end() ; ++j)
1113 if (i->comparison()==detail::equal)
1118 *i=linear_inequality(i->lhs(),i->rhs(),detail::less);
1119 if (is_inconsistent(inequalities,r))
1122 if (is_inconsistent(inequalities,r))
1137 if (is_inconsistent(inequalities,r))
1161 const std::vector < linear_inequality >& inequalities,
1162 std::vector < linear_inequality >& resulting_inequalities,
1165 assert(resulting_inequalities.empty());
1166 if (inequalities.empty())
1172 if (is_inconsistent(inequalities,r))
1174 resulting_inequalities.push_back(linear_inequality());
1178 resulting_inequalities=inequalities;
1179 for (std::size_t i=0; i<resulting_inequalities.size();)
1183 if (resulting_inequalities[i].comparison()==detail::equal)
1190 if (is_a_redundant_inequality(resulting_inequalities,
1191 resulting_inequalities.begin()+i,
1195
1196
1197
1198
1199
1200
1201 resulting_inequalities.erase(resulting_inequalities.begin()+i);
1218 std::map < variable,data_expression >& beta,
1219 std::map < variable,data_expression >& beta_delta_correction,
1220 std::set < variable >& basic_variables,
1221 std::map < variable, detail::lhs_t >& working_equalities,
1226 const data_expression theta=rewrite_with_memory(real_divides(real_minus(v,beta[xi]),aij),r);
1227 const data_expression theta_delta_correction=rewrite_with_memory(real_divides(real_minus(v,beta_delta_correction[xi]),aij),r);
1229 beta_delta_correction[xi]=v_delta_correction;
1230 beta[xj]=rewrite_with_memory(real_plus(beta[xj],theta),r);
1231 beta_delta_correction[xj]=rewrite_with_memory(real_plus(beta_delta_correction[xj],theta_delta_correction),r);
1234 for (std::set < variable >::const_iterator k=basic_variables.begin();
1235 k!=basic_variables.end(); ++k)
1237 mCRL2log(log::trace) <<
"Working equalities " << *k <<
": " << pp(working_equalities[*k]) <<
"\n";
1238 if ((*k!=xi) && (working_equalities[*k].count(xj)>0))
1240 const data_expression akj=working_equalities[*k][xj];
1241 beta[*k]=rewrite_with_memory(real_plus(beta[*k],real_times(akj ,theta)),r);
1242 beta_delta_correction[*k]=rewrite_with_memory(real_plus(beta_delta_correction[*k],real_times(akj ,theta_delta_correction)),r);
1247 basic_variables.erase(xi);
1248 basic_variables.insert(xj);
1250 detail::
lhs_t expression_for_xj=working_equalities[xi];
1251 expression_for_xj=expression_for_xj
.erase(xj
);
1256 working_equalities.erase(xi);
1258 for (std::map < variable, detail::lhs_t >::iterator j=working_equalities.begin();
1259 j!=working_equalities.end(); ++j)
1261 if (j->second.count(xj)>0)
1263 const data_expression factor=j->second[xj];
1264 mCRL2log(log::trace) <<
"VAR: " << pp(j->first) <<
" Factor " << pp(factor) <<
"\n";
1265 j->second=j->second.erase(xj);
1269 j->second=add(j->second,multiply(expression_for_xj,factor,r),r);
1273 working_equalities[xj]=expression_for_xj;
1277 for (std::map < variable, detail::lhs_t >::const_iterator i=working_equalities.begin();
1278 i!=working_equalities.end() ; ++i)
1280 beta[i->first]=i->second.evaluate(make_map_substitution(beta),r);
1281 beta_delta_correction[i->first]=i->second.evaluate(make_map_substitution(beta_delta_correction),r);
1287 for (std::map < variable,data_expression >::const_iterator i=beta.begin();
1290 mCRL2log(log::trace) <<
"(1) beta[" << pp(i->first) <<
"]= " << pp(beta[i->first]) <<
"+ delta* " << pp(beta_delta_correction[i->first]) <<
"\n";
1292 for (std::map < variable, detail::lhs_t >::const_iterator i=working_equalities.begin();
1293 i!=working_equalities.end() ; ++i)
1295 mCRL2log(log::trace) <<
"EQ: " << pp(i->first) <<
" := " << pp(i->second) <<
"\n";
1328 const node_type node,
1375 std::set < linear_inequality > inequalities_in(inequalities_in_.begin(),inequalities_in_.end());
1377 for(
const linear_inequality& l: inequalities_in)
1380
1381 while (current_root->m_node==intermediate_node && l>current_root->m_inequality)
1383 current_root=current_root->m_non_present_branch;
1385 if (current_root->m_node==intermediate_node)
1387 if (l==current_root->m_inequality)
1389 current_root=current_root->m_present_branch;
1391 assert(current_root->m_node!=intermediate_node || l<current_root->m_inequality);
1395 return current_root->m_node==true_end_node;
1403 std::set < linear_inequality > inequalities_in(inequalities_in_.begin(),inequalities_in_.end());
1405 for(
const linear_inequality& l: inequalities_in)
1408
1409 while ((*current_root)->m_node==intermediate_node && l>(*current_root)->m_inequality)
1411 current_root=&((*current_root)->m_non_present_branch);
1413 if ((*current_root)->m_node==intermediate_node)
1415 if (l==(*current_root)->m_inequality)
1417 current_root=&((*current_root)->m_present_branch);
1418 assert((*current_root)->m_node!=intermediate_node || l<(*current_root)->m_inequality);
1423 inequality_inconsistency_cache_base* new_false_node =
new inequality_inconsistency_cache_base(false_end_node);
1424 inequality_inconsistency_cache_base* new_node =
new inequality_inconsistency_cache_base(intermediate_node,l,new_false_node,*current_root);
1425 *current_root=new_node;
1426 current_root = &(new_node->m_present_branch);
1431 if ((*current_root)->m_node==true_end_node)
1441 inequality_inconsistency_cache_base* new_false_node=
new inequality_inconsistency_cache_base(false_end_node);
1442 inequality_inconsistency_cache_base* new_node =
new inequality_inconsistency_cache_base(intermediate_node,l,new_false_node,*current_root);
1443 *current_root=new_node;
1444 current_root = &(new_node->m_present_branch);
1452 assert(*current_root!=
nullptr);
1453 delete *current_root;
1483 bool is_consistent(
const std::vector < linear_inequality >& inequalities_in_)
const
1485 std::set < linear_inequality > inequalities_in(inequalities_in_.begin(),inequalities_in_.end());
1487 for(std::set < linear_inequality >::const_iterator i=inequalities_in.begin(); i!=inequalities_in.end(); ++i)
1489 while (current_root->m_node==intermediate_node && *i>current_root->m_inequality)
1491 current_root=current_root->m_non_present_branch;
1493 if (current_root->m_node==intermediate_node)
1495 if (*i==current_root->m_inequality)
1497 current_root=current_root->m_present_branch;
1503 assert(current_root->m_node!=intermediate_node || *i<current_root->m_inequality);
1507 return current_root->m_node!=false_end_node && i==inequalities_in.end();
1515 std::set < linear_inequality > inequalities_in(inequalities_in_.begin(),inequalities_in_.end());
1517 for(
const linear_inequality& l: inequalities_in)
1520
1521 while ((*current_root)->m_node==intermediate_node && l>(*current_root)->m_inequality)
1523 current_root=&((*current_root)->m_non_present_branch);
1525 if ((*current_root)->m_node==intermediate_node)
1527 if (l==(*current_root)->m_inequality)
1529 current_root=&((*current_root)->m_present_branch);
1530 assert((*current_root)->m_node!=intermediate_node || l<(*current_root)->m_inequality);
1535 inequality_inconsistency_cache_base* new_true_node =
new inequality_inconsistency_cache_base(true_end_node);
1536 inequality_inconsistency_cache_base* new_node =
new inequality_inconsistency_cache_base(intermediate_node,l,new_true_node,*current_root);
1537 *current_root=new_node;
1538 current_root = &(new_node->m_present_branch);
1544 inequality_inconsistency_cache_base* new_true_node=
new inequality_inconsistency_cache_base(true_end_node);
1545 inequality_inconsistency_cache_base* new_node =
new inequality_inconsistency_cache_base(intermediate_node,l,new_true_node,*current_root);
1546 *current_root=new_node;
1547 current_root = &(new_node->m_present_branch);
1571 const std::vector < linear_inequality >& inequalities_in,
1573 const bool use_cache)
1583 mCRL2log(log::trace) <<
"Starting an inconsistency check on " + pp_vector(inequalities_in) <<
"\n";
1588 if (use_cache && consistency_cache.is_consistent(inequalities_in))
1590 assert(!is_inconsistent(inequalities_in,r,
false));
1593 if (use_cache && inconsistency_cache.is_inconsistent(inequalities_in))
1595 assert(is_inconsistent(inequalities_in,r,
false));
1599 std::map < variable,data_expression > lowerbounds;
1600 std::map < variable,data_expression > upperbounds;
1601 std::map < variable,data_expression > beta;
1602 std::map < variable,data_expression > lowerbounds_delta_correction;
1603 std::map < variable,data_expression > upperbounds_delta_correction;
1604 std::map < variable,data_expression > beta_delta_correction;
1605 std::set < variable > non_basic_variables;
1606 std::set < variable > basic_variables;
1607 std::map < variable, detail::lhs_t > working_equalities;
1611 for (std::vector < linear_inequality >::const_iterator i=inequalities_in.begin();
1612 i!=inequalities_in.end(); ++i)
1616 mCRL2log(log::trace) <<
"Inconsistent, because linear inequalities contains an inconsistent inequality\n";
1619 inconsistency_cache.add_inconsistent_inequality_set(inequalities_in);
1620 assert(inconsistency_cache.is_inconsistent(inequalities_in));
1624 i->add_variables(non_basic_variables);
1625 for (detail::lhs_t::const_iterator j=i->lhs_begin();
1626 j!=i->lhs_end(); ++j)
1628 fresh_variable_name.add_identifier(j->variable_name().name());
1632 std::vector < linear_inequality > inequalities;
1633 std::vector < linear_inequality > equalities;
1634 non_basic_variables=
1635 gauss_elimination(inequalities_in,
1638 non_basic_variables.begin(),
1639 non_basic_variables.end(),
1642 assert(equalities.size()==0);
1643 non_basic_variables.clear();
1646 mCRL2log(log::trace) <<
"Resulting equalities " << pp_vector(equalities) <<
"\n";
1647 mCRL2log(log::trace) <<
"Resulting inequalities " << pp_vector(inequalities) <<
"\n";
1654 for (std::vector < linear_inequality >::iterator i=inequalities.begin();
1655 i!=inequalities.end(); ++i)
1657 mCRL2log(log::trace) <<
"Investigate inequality: " <<
":=" << pp(*i) <<
" || " << pp(i->lhs()) <<
"\n";
1660 mCRL2log(log::trace) <<
"Inconsistent, because linear inequalities contains an inconsistent inequality after Gauss elimination\n";
1663 inconsistency_cache.add_inconsistent_inequality_set(inequalities_in);
1664 assert(inconsistency_cache.is_inconsistent(inequalities_in));
1670 assert(i->comparison()!=detail::equal);
1671 assert(i->lhs().size()>0);
1672 i->add_variables(non_basic_variables);
1674 if (i->lhs().size()==1)
1676 variable v=i->lhs_begin()->variable_name();
1677 data_expression factor=i->lhs_begin()->factor();
1678 assert(factor!=real_zero());
1679 data_expression bound=rewrite_with_memory(real_divides(i->rhs(),factor),r);
1680 if (is_positive(factor,r))
1683 if ((upperbounds.count(v)==0) ||
1684 (rewrite_with_memory(less(bound,upperbounds[v]),r)==sort_bool::true_()))
1686 upperbounds[v]=bound;
1687 upperbounds_delta_correction[v]=
1688 ((i->comparison()==detail::less)?real_minus_one():real_zero());
1693 if (bound==upperbounds[v])
1695 upperbounds_delta_correction[v]=
1696 min(upperbounds_delta_correction[v],
1697 ((i->comparison()==detail::less)?real_minus_one():real_zero()),r);
1704 if ((lowerbounds.count(v)==0) ||
1705 (rewrite_with_memory(less(lowerbounds[v],bound),r)==sort_bool::true_()))
1707 lowerbounds[v]=bound;
1708 lowerbounds_delta_correction[v]=
1709 ((i->comparison()==detail::less)?real_one():real_zero());
1713 if (bound==lowerbounds[v])
1715 lowerbounds_delta_correction[v]=
1716 max(lowerbounds_delta_correction[v],
1717 ((i->comparison()==detail::less)?real_one():real_zero()),r);
1726 variable new_basic_variable(fresh_variable_name(
"slack_var"), sort_real::real_());
1727 basic_variables.insert(new_basic_variable);
1728 upperbounds[new_basic_variable]=i->rhs();
1729 upperbounds_delta_correction[new_basic_variable]=
1730 ((i->comparison()==detail::less)?real_minus_one():real_zero());
1731 working_equalities[new_basic_variable]=i->lhs();
1732 mCRL2log(log::trace) <<
"New slack variable: " << pp(new_basic_variable) <<
":=" << pp(*i) <<
" " << pp(i->lhs()) <<
"\n";
1739 for (std::set < variable >::const_iterator i=non_basic_variables.begin();
1740 i!=non_basic_variables.end(); ++i)
1742 if (lowerbounds.count(*i)>0)
1744 if ((upperbounds.count(*i)>0) &&
1745 ((rewrite_with_memory(less(upperbounds[*i],lowerbounds[*i]),r)==sort_bool::true_()) ||
1746 ((upperbounds[*i]==lowerbounds[*i]) &&
1747 (rewrite_with_memory(less(upperbounds_delta_correction[*i],lowerbounds_delta_correction[*i]),r)==sort_bool::true_()))))
1749 mCRL2log(log::trace) <<
"Inconsistent, preprocessing " << pp(*i) <<
"\n";
1752 inconsistency_cache.add_inconsistent_inequality_set(inequalities_in);
1753 assert(inconsistency_cache.is_inconsistent(inequalities_in));
1757 beta[*i]=lowerbounds[*i];
1758 beta_delta_correction[*i]=lowerbounds_delta_correction[*i];
1760 else if (upperbounds.count(*i)>0)
1762 beta[*i]=upperbounds[*i];
1763 beta_delta_correction[*i]=upperbounds_delta_correction[*i];
1767 beta[*i]=real_zero();
1768 beta_delta_correction[*i]=real_zero();
1770 mCRL2log(log::trace) <<
"(2) beta[" << pp(*i) <<
"]=" << pp(beta[*i])<<
"+delta*" << pp(beta_delta_correction[*i]) <<
"\n";
1774 for (std::set < variable >::const_iterator i=basic_variables.begin();
1775 i!=basic_variables.end(); ++i)
1777 beta[*i]=working_equalities[*i].evaluate(make_map_substitution(beta),r);
1778 beta_delta_correction[*i]=working_equalities[*i].
1779 evaluate(make_map_substitution(beta_delta_correction),r);
1780 mCRL2log(log::trace) <<
"(3) beta[" << pp(*i) <<
"]=" << pp(beta[*i])<<
"+delta*" << pp(beta_delta_correction[*i]) <<
"\n";
1792 bool lowerbound_violation =
false;
1794 for (std::set < variable > :: const_iterator i=basic_variables.begin() ;
1795 i!=basic_variables.end() ; ++i)
1797 mCRL2log(log::trace) <<
"Evaluate start\n";
1799 data_expression value=beta[*i];
1800 data_expression value_delta_correction=beta_delta_correction[*i];
1801 mCRL2log(log::trace) <<
"Evaluate end\n";
1802 if ((upperbounds.count(*i)>0) &&
1803 ((rewrite_with_memory(less(upperbounds[*i],value),r)==sort_bool::true_()) ||
1804 ((upperbounds[*i]==value) &&
1805 (rewrite_with_memory(less(upperbounds_delta_correction[*i],value_delta_correction),r)==sort_bool::true_()))))
1809 mCRL2log(log::trace) <<
"Upperbound violation " << pp(*i) <<
" bound: " << pp(upperbounds[*i]) <<
"\n";
1812 lowerbound_violation=
false;
1815 else if ((lowerbounds.count(*i)>0) &&
1816 ((rewrite_with_memory(less(value,lowerbounds[*i]),r)==sort_bool::true_()) ||
1817 ((lowerbounds[*i]==value) &&
1818 (rewrite_with_memory(less(value_delta_correction,lowerbounds_delta_correction[*i]),r)==sort_bool::true_()))))
1822 mCRL2log(log::trace) <<
"Lowerbound violation " << pp(*i) <<
" bound: " << pp(lowerbounds[*i]) <<
"\n";
1825 lowerbound_violation=
true;
1835 consistency_cache.add_consistent_inequality_set(inequalities_in);
1836 assert(consistency_cache.is_consistent(inequalities_in));
1842 if (lowerbound_violation)
1848 for (detail::lhs_t::const_iterator xj_it=lhs.begin(); xj_it!=lhs.end(); ++xj_it)
1850 const variable xj=xj_it->variable_name();
1851 mCRL2log(log::trace) << pp(xj) <<
" -- " << pp(xj_it->factor()) <<
"\n";
1852 if ((is_positive(xj_it->factor(),r) &&
1853 ((upperbounds.count(xj)==0) ||
1854 ((rewrite_with_memory(less(beta[xj],upperbounds[xj]),r)==sort_bool::true_())||
1855 ((beta[xj]==upperbounds[xj])&& (rewrite_with_memory(less(beta_delta_correction[xj],upperbounds_delta_correction[xj]),r)==sort_bool::true_()))))) ||
1856 (is_negative(xj_it->factor(),r) &&
1857 ((lowerbounds.count(xj)==0) ||
1858 ((rewrite_with_memory(greater(beta[xj],lowerbounds[xj]),r)==sort_bool::true_())||
1859 ((beta[xj]==lowerbounds[xj]) && (rewrite_with_memory(greater(beta_delta_correction[xj],lowerbounds_delta_correction[xj]),r)==sort_bool::true_()))))))
1862 pivot_and_update(xi,xj,lowerbounds[xi],lowerbounds_delta_correction[xi],
1863 beta, beta_delta_correction,
1864 basic_variables,working_equalities,r);
1874 inconsistency_cache.add_inconsistent_inequality_set(inequalities_in);
1875 assert(inconsistency_cache.is_inconsistent(inequalities_in));
1886 for (detail::lhs_t::const_iterator xj_it=working_equalities[xi].begin();
1887 xj_it!=working_equalities[xi].end(); ++xj_it)
1889 const variable xj=xj_it->variable_name();
1890 mCRL2log(log::trace) << pp(xj) <<
" -- " << pp(xj_it->factor()) <<
" POS " << is_positive(xj_it->factor(),r) <<
"\n";
1891 if ((is_negative(xj_it->factor(),r) &&
1892 ((upperbounds.count(xj)==0) ||
1893 ((rewrite_with_memory(less(beta[xj],upperbounds[xj]),r)==sort_bool::true_()) ||
1894 ((beta[xj]==upperbounds[xj])&& (rewrite_with_memory(less(beta_delta_correction[xj],upperbounds_delta_correction[xj]),r)==sort_bool::true_()))))) ||
1895 (is_positive(xj_it->factor(),r) &&
1896 ((lowerbounds.count(xj)==0) ||
1897 ((rewrite_with_memory(greater(beta[xj],lowerbounds[xj]),r)==sort_bool::true_()) ||
1898 ((beta[xj]==lowerbounds[xj]) && (rewrite_with_memory(greater(beta_delta_correction[xj],lowerbounds_delta_correction[xj]),r)==sort_bool::true_()))))))
1901 pivot_and_update(xi,xj,upperbounds[xi],upperbounds_delta_correction[xi],
1902 beta,beta_delta_correction,
1903 basic_variables,working_equalities,r);
1913 inconsistency_cache.add_inconsistent_inequality_set(inequalities_in);
1914 assert(inconsistency_cache.is_inconsistent(inequalities_in));
1943template <
class Variable_iterator >
1952 std::set < variable > remaining_variables;
1955 for (std::vector < linear_inequality > ::const_iterator j = inequalities.begin(); j != inequalities.end(); ++j)
1960 resulting_equalities.clear();
1961 resulting_inequalities.clear();
1962 resulting_inequalities.push_back(linear_inequality());
1963 return remaining_variables;
1965 else if (!j->is_true(r))
1967 if (j->comparison()==detail::equal)
1969 resulting_equalities.push_back(*j);
1973 resulting_inequalities.push_back(*j);
1980 for (Variable_iterator i = variables_begin; i != variables_end; ++i)
1983 for (j=0; j<resulting_equalities.size(); ++j)
1985 bool check_equalities_for_redundant_inequalities(
false);
1986 std::set < variable > vars;
1987 resulting_equalities[j].add_variables(vars);
1988 if (vars.count(*i)>0)
1993 for (std::size_t k = 0; k < resulting_inequalities.size();)
1995 resulting_inequalities[k]=subtract(resulting_inequalities[k],
1996 resulting_equalities[j],
1997 resulting_inequalities[k].get_factor_for_a_variable(*i),
1998 resulting_equalities[j].get_factor_for_a_variable(*i),
2000 if (resulting_inequalities[k].is_false(r))
2003 resulting_equalities.clear();
2004 resulting_inequalities.clear();
2005 resulting_inequalities.push_back(linear_inequality());
2006 remaining_variables.clear();
2007 return remaining_variables;
2009 else if (resulting_inequalities[k].is_true(r))
2012 if ((k+1)<resulting_inequalities.size())
2014 resulting_inequalities[k].swap(resulting_inequalities.back());
2016 resulting_inequalities.pop_back();
2024 for (std::size_t k = 0; k<resulting_equalities.size();)
2032 resulting_equalities[k]=subtract(
2033 resulting_equalities[k],
2034 resulting_equalities[j],
2035 resulting_equalities[k].get_factor_for_a_variable(*i),
2036 resulting_equalities[j].get_factor_for_a_variable(*i),
2038 if (resulting_equalities[k].is_false(r))
2041 resulting_equalities.clear();
2042 resulting_inequalities.clear();
2043 resulting_inequalities.push_back(linear_inequality());
2044 remaining_variables.clear();
2045 return remaining_variables;
2047 else if (resulting_equalities[k].is_true(r))
2050 if (j+1==resulting_equalities.size())
2056 check_equalities_for_redundant_inequalities=
true;
2060 if ((k+1)<resulting_equalities.size())
2062 resulting_equalities[k].swap(resulting_equalities.back());
2064 resulting_equalities.pop_back();
2076 if (j+1<resulting_equalities.size())
2078 resulting_equalities[j].swap(resulting_equalities.back());
2080 resulting_equalities.pop_back();
2083 if (check_equalities_for_redundant_inequalities)
2085 for (std::size_t k = 0; k<resulting_equalities.size();)
2087 if (resulting_equalities[k].is_true(r))
2090 if ((k+1)<resulting_equalities.size())
2092 resulting_equalities[k].swap(resulting_equalities.back());
2094 resulting_equalities.pop_back();
2104 remaining_variables.insert(*i);
2107 return remaining_variables;
2118 static std::map < data_expression, data_expression > rewrite_hash_table;
2119 std::map < data_expression, data_expression > :: iterator i=rewrite_hash_table.find(t);
2120 if (i==rewrite_hash_table.end())
2123 rewrite_hash_table.insert(std::make_pair(t, t1));
aterm_string & operator=(const aterm_string &t) noexcept=default
const aterm & operator[](const size_type i) const
Returns the i-th argument.
const function_symbol & function() const
Returns the function symbol belonging to an aterm.
bool operator==(const function_symbol &f) const
Equality test.
void swap(unprotected_aterm_core &t) noexcept
Swaps this term with its argument.
bool operator==(const unprotected_aterm_core &t) const
Comparison operator.
bool operator!=(const unprotected_aterm_core &t) const
Inequality operator on two unprotected aterms.
An abstraction expression.
const variable_list & variables() const
const data_expression & body() const
const binder_type & binding_operator() const
alias(const basic_sort &name, const sort_expression &reference)
\brief Constructor Z12.
\brief Assignment of a data expression to a variable
const data_expression & rhs() const
const variable & lhs() const
data_expression & operator=(const data_expression &) noexcept=default
data_expression()
\brief Default constructor X3.
data_expression & operator=(data_expression &&) noexcept=default
sort_expression sort() const
Returns the sort of the data expression.
data_expression(const data_expression &) noexcept=default
Move semantics.
~inequality_consistency_cache()
inequality_consistency_cache()
void add_consistent_inequality_set(const std::vector< linear_inequality > &inequalities_in_)
inequality_consistency_cache & operator=(const inequality_consistency_cache &)=delete
inequality_consistency_cache(const inequality_consistency_cache &)=delete
inequality_inconsistency_cache_base * m_cache
bool is_consistent(const std::vector< linear_inequality > &inequalities_in_) const
inequality_inconsistency_cache_base & operator=(const inequality_inconsistency_cache_base &)=delete
inequality_inconsistency_cache_base * m_present_branch
linear_inequality m_inequality
inequality_inconsistency_cache_base * m_non_present_branch
inequality_inconsistency_cache_base(const node_type node, const linear_inequality &inequality, inequality_inconsistency_cache_base *present_branch, inequality_inconsistency_cache_base *non_present_branch)
~inequality_inconsistency_cache_base()
inequality_inconsistency_cache_base(const inequality_inconsistency_cache_base &)=delete
inequality_inconsistency_cache_base(const node_type node)
~inequality_inconsistency_cache()
bool is_inconsistent(const std::vector< linear_inequality > &inequalities_in_) const
inequality_inconsistency_cache()
inequality_inconsistency_cache & operator=(const inequality_consistency_cache &)=delete
inequality_inconsistency_cache_base * m_cache
inequality_inconsistency_cache(const inequality_inconsistency_cache &)=delete
void add_inconsistent_inequality_set(const std::vector< linear_inequality > &inequalities_in_)
lhs_t(const aterm &t)
Constructor from an aterm.
const data_expression & operator[](const variable &v) const
Give the factor of variable v.
data_expression transform_to_data_expression() const
lhs_t erase(const variable &v) const
Erase a variable and its factor.
std::size_t count(const variable &v) const
Give the factor of variable v.
lhs_t(const ITERATOR begin, const ITERATOR end, TRANSFORMER f)
Constructor.
data_expression evaluate(const SubstitutionFunction &beta, const rewriter &r) const
Evaluate the variables in this lhs_t according to the subsitution function.
lhs_t::const_iterator find(const variable &v) const
Give an iterator of the factor/variable pair for v, or end() if v does not occur.
lhs_t(const ITERATOR begin, const ITERATOR end)
Constructor.
variable_with_a_rational_factor(const variable &v, const data_expression &f)
const variable & variable_name() const
data_expression transform_to_data_expression() const
bool is_variable_with_a_rational_factor() const
const data_expression & factor() const
function_symbol & operator=(function_symbol &&) noexcept=default
function_symbol()
Default constructor.
const detail::lhs_t & lhs() const
linear_inequality invert(const rewriter &r)
bool typical_pair(data_expression &lhs_expression, data_expression &rhs_expression, detail::comparison_t &comparison_operator, const rewriter &r) const
Return this inequality as a typical pair of terms of the form <x1+c2 x2+...+cn xn,...
linear_inequality()
Constructor yielding an inconsistent inequality.
bool is_true(const rewriter &r) const
void add_variables(std::set< variable > &variable_set) const
bool is_false(const rewriter &r) const
linear_inequality(const data_expression &e, const rewriter &r)
Constructor that constructs a linear inequality out of a data expression.
linear_inequality(const data_expression &lhs, const data_expression &rhs, const detail::comparison_t comparison, const rewriter &r, const bool negate=false)
constructor.
data_expression transform_to_data_expression() const
static void parse_and_store_expression(const data_expression &e, detail::map_based_lhs_t &new_lhs, data_expression &new_rhs, const rewriter &r, const bool negate=false, const data_expression &factor=real_one())
linear_inequality(const detail::lhs_t &lhs, const data_expression &r, detail::comparison_t t)
Basic constructor.
detail::lhs_t::const_iterator lhs_begin() const
detail::lhs_t::const_iterator lhs_end() const
linear_inequality(const detail::lhs_t &lhs, const data_expression &rhs, detail::comparison_t comparison, const rewriter &r)
constructor.
const data_expression & rhs() const
data_expression get_factor_for_a_variable(const variable &x)
detail::comparison_t comparison() const
Wrapper class for internal storage and substitution updates using operator()
std::multiset< variable_type > & m_variables_in_rhs
assignment(const variable_type &v, Substitution &sigma, std::multiset< variable_type > &variables_in_rhs, std::set< variable_type > &scratch_set)
Constructor.
const variable_type & m_variable
std::set< variable_type > & m_scratch_set
void operator=(const expression_type &e)
Actual assignment.
Wrapper that extends any substitution to a substitution maintaining the vars in its rhs.
bool variable_occurs_in_a_rhs(const variable_type &v)
Indicates whether a variable occurs in some rhs of this substitution.
assignment operator[](variable_type const &v)
Assigment operator.
void clear()
Clear substitutions.
std::set< variable_type > m_scratch_set
const std::multiset< variable > & variables_in_rhs()
Provides a set of variables that occur in the right hand sides of the assignments.
super::expression_type expression_type
std::multiset< variable_type > m_variables_in_rhs
maintain_variables_in_rhs()
Default constructor.
super::variable_type variable_type
Rewriter that operates on data expressions.
data_expression operator()(const data_expression &d) const
Rewrites a data expression.
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
sort_expression & operator=(const sort_expression &) noexcept=default
\brief An argument of a constructor of a structured sort
\brief A constructor for a structured sort
function_symbol constructor_function(const sort_expression &s) const
Returns the constructor function for this constructor, assuming it is internally represented with sor...
function_symbol recogniser_function(const sort_expression &s) const
Returns the function corresponding to the recogniser of this constructor, such that it is usable in t...
variable(const std::string &name, const sort_expression &sort)
Constructor.
const core::identifier_string & name() const
variable & operator=(variable &&) noexcept=default
const sort_expression & sort() const
\brief A where expression
where_clause(const atermpp::aterm &term)
logger(const log_level_t l)
Default constructor.
bool has_time() const
Returns true if time is available.
Algorithm class for elimination of constant parameters.
LPS summand containing a deadlock.
deadlock_summand(const data::variable_list &summation_variables, const data::data_expression &condition, const lps::deadlock &delta)
Constructor.
deadlock(data::data_expression time=data::undefined_real())
Constructor.
ultimate_delay()
Constructor.
data_expression & constraint()
Obtain a reference to the constraint.
\brief A timed multi-action
multi_action(const process::action_list &actions=process::action_list(), data::data_expression time=data::undefined_real())
Constructor.
LPS summand containing a multi-action.
stochastic_action_summand(const data::variable_list &summation_variables, const data::data_expression &condition, const lps::multi_action &action, const data::assignment_list &assignments, const stochastic_distribution &distribution)
Constructor.
\brief A stochastic distribution
stochastic_distribution & operator=(stochastic_distribution &&) noexcept=default
stochastic_distribution()
\brief Default constructor X3.
const data::variable_list & variables() const
stochastic_distribution(const data::variable_list &variables, const data::data_expression &distribution)
\brief Constructor Z12.
const data::data_expression & distribution() const
stochastic_linear_process(const data::variable_list &process_parameters, const deadlock_summand_vector &deadlock_summands, const stochastic_action_summand_vector &action_summands)
Constructor.
A stochastic process initializer.
stochastic_process_initializer(const data::data_expression_list &expressions, const stochastic_distribution &distribution)
Constructor.
Linear process specification.
const core::identifier_string & name() const
action(const atermpp::aterm &term)
const data::data_expression_list & arguments() const
const action_label & label() const
\brief The allow operator
allow(const atermpp::aterm &term)
const process_expression & operand() const
at(const atermpp::aterm &term)
at(const process_expression &operand, const data::data_expression &time_stamp)
\brief Constructor Z14.
const data::data_expression & time_stamp() const
const process_expression & operand() const
\brief The block operator
const process_expression & operand() const
block(const atermpp::aterm &term)
\brief The choice operator
choice(const atermpp::aterm &term)
const process_expression & left() const
choice(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
const process_expression & right() const
\brief The communication operator
comm(const atermpp::aterm &term)
const process_expression & operand() const
delta()
\brief Default constructor X3.
hide(const atermpp::aterm &term)
const core::identifier_string_list & hide_set() const
const process_expression & operand() const
\brief The if-then-else operator
const process_expression & else_case() const
const process_expression & then_case() const
if_then_else(const atermpp::aterm &term)
const data::data_expression & condition() const
if_then_else(const data::data_expression &condition, const process_expression &then_case, const process_expression &else_case)
\brief Constructor Z14.
\brief The if-then operator
const process_expression & then_case() const
if_then(const data::data_expression &condition, const process_expression &then_case)
\brief Constructor Z14.
if_then(const atermpp::aterm &term)
const data::data_expression & condition() const
\brief The merge operator
merge(const atermpp::aterm &term)
const process_expression & right() const
const process_expression & left() const
\brief A process expression
process_expression & operator=(const process_expression &) noexcept=default
process_expression(const process_expression &) noexcept=default
Move semantics.
process_expression()
\brief Default constructor X3.
process_expression & operator=(process_expression &&) noexcept=default
\brief A process identifier
process_identifier(const process_identifier &) noexcept=default
Move semantics.
process_identifier & operator=(const process_identifier &) noexcept=default
const core::identifier_string & name() const
process_identifier & operator=(process_identifier &&) noexcept=default
process_identifier()
Default constructor.
process_identifier(const std::string &name, const data::variable_list &variables)
Constructor.
process_identifier(const atermpp::aterm &term)
Constructor.
\brief A process assignment
process_instance_assignment(const process_identifier &identifier, const data::assignment_list &assignments)
\brief Constructor Z14.
const data::assignment_list & assignments() const
process_instance_assignment(const atermpp::aterm &term)
const process_identifier & identifier() const
const data::data_expression_list & actual_parameters() const
const process_identifier & identifier() const
Process specification consisting of a data specification, action labels, a sequence of process equati...
process_expression & init()
Returns the initialization of the process specification.
process::action_label_list & action_labels()
Returns the action label specification.
\brief The rename operator
rename(const atermpp::aterm &term)
const process_expression & operand() const
const rename_expression_list & rename_set() const
\brief The sequential composition
const process_expression & right() const
seq(const atermpp::aterm &term)
const process_expression & left() const
seq(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
\brief The distribution operator
const data::variable_list & variables() const
const data::data_expression & distribution() const
const process_expression & operand() const
stochastic_operator(const data::variable_list &variables, const data::data_expression &distribution, const process_expression &operand)
\brief Constructor Z14.
const process_expression & operand() const
sum(const data::variable_list &variables, const process_expression &operand)
\brief Constructor Z14.
sum(const atermpp::aterm &term)
const data::variable_list & variables() const
\brief The synchronization operator
const process_expression & left() const
sync(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
const process_expression & right() const
sync(const atermpp::aterm &term)
tau()
\brief Default constructor X3.
Standard exception class for reporting runtime errors.
process_expression processbody
objectdatatype(const objectdatatype &o)=default
process_expression representedprocess
variable_list old_parameters
bool free_variables_defined
~objectdatatype()=default
process::action_label_list multi_action_names
processstatustype processstatus
identifier_string objectname
objectdatatype & operator=(const objectdatatype &o)=default
std::set< variable > free_variables
process_identifier process_representing_action
function_symbol_list functions
data_expression_list elementnames
enumeratedtype(const enumeratedtype &e)
enumeratedtype(const std::size_t n, specification_basic_type &spec)
void operator=(const enumeratedtype &e)
enumtype(const enumtype &)=delete
enumtype & operator=(const enumtype &)=delete
std::size_t enumeratedtype_index
enumtype(std::size_t n, const sort_expression_list &fsorts, const sort_expression_list &gsorts, specification_basic_type &spec)
process_expression m_process_body
process_pid_pair & operator=(const process_pid_pair &other)=default
const process_expression & process_body() const
const process_identifier & process_id() const
process_pid_pair(const process_pid_pair &other)=default
process_pid_pair & operator=(process_pid_pair &&other)=default
process_pid_pair(const process_expression &process_body, const process_identifier &pid)
process_pid_pair(process_pid_pair &&other)=default
variable_list booleanStateVariables
static stackoperations * find_suitable_stack_operations(const variable_list ¶meters, stackoperations *stack_operations_list)
stacklisttype & operator=(const stacklisttype &)=delete
stacklisttype(const variable_list &parlist, specification_basic_type &spec, const bool regular, const std::set< process_identifier > &pCRLprocs, const bool singlecontrolstate)
Constructor.
stacklisttype(const stacklisttype &)=delete
stackoperations & operator=(const stackoperations &)=delete
data::function_symbol pop
data::function_symbol push
stackoperations(const stackoperations &)=delete
sort_expression_list sorts
data::function_symbol empty
data::function_symbol getstate
variable_list parameter_list
data::function_symbol emptystack
stackoperations(const variable_list &pl, specification_basic_type &spec)
sort_expression stacksort
process_expression procstorealGNFbody(const process_expression &body, variableposition v, std::vector< process_identifier > &todo, const bool regular, processstatustype mode, const variable_list &freevars, const std::set< variable > &variables_bound_in_sum)
data_expression construct_binary_case_tree(std::size_t n, const variable_list &sums, data_expression_list terms, const sort_expression &termsort, const enumtype &e)
data::maintain_variables_in_rhs< data::mutable_map_substitution<> > make_unique_variables(const variable_list &var_list, const std::string &hint)
variable_list parscollect(const process_expression &oldbody, process_expression &newbody)
action_list linMergeMultiActionList(const action_list &ma1, const action_list &ma2)
const objectdatatype & objectIndex(const aterm &o) const
void generateLPEpCRL(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process_identifier &procId, const bool containstime, const bool regular, variable_list ¶meters, data_expression_list &init, stochastic_distribution &initial_stochastic_distribution)
variable get_fresh_variable(const std::string &s, const sort_expression &sort, const int reuse_index=-1)
process_expression distributeActionOverConditions(const process_expression &act, const data_expression &condition, const process_expression &restterm, const variable_list &freevars, const std::set< variable > &variables_bound_in_sum)
data_expression construct_binary_case_tree_rec(std::size_t n, const variable_list &sums, data_expression_list &terms, const sort_expression &termsort, const enumtype &e)
static void complete_proc_identifier_map(std::map< process_identifier, process_identifier > &identifier_identifier_map)
process_expression to_regular_form(const process_expression &t, std::vector< process_identifier > &todo, const variable_list &freevars, const std::set< variable > &variables_bound_in_sum)
void collectsumlistterm(const process_identifier &procId, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process_expression &body, const variable_list &pars, const stacklisttype &stack, const bool regular, const bool singlestate, const std::set< process_identifier > &pCRLprocs)
data_expression_list findarguments(const variable_list &pars, const variable_list &parlist, const assignment_list &args, const data_expression_list &t2, const stacklisttype &stack, const variable_list &vars, const std::set< variable > &free_variables_in_body, const variable_list &stochastic_variables)
void calculate_communication_merge(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const stochastic_action_summand_vector &action_summands2, const deadlock_summand_vector &deadlock_summands2, const action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
void insertvariable(const variable &var, const bool mustbenew)
process_identifier storeinit(const process_expression &init)
static action_list to_sorted_action_list(const process_expression &p)
Convert the process expression to a sorted action list.
process_expression guarantee_that_parameters_have_unique_type_body(const process_expression &t, std::set< process_identifier > &visited_processes, std::set< identifier_string > &used_variable_names, maintain_variables_in_rhs< mutable_map_substitution<> > ¶meter_mapping, std::set< variable > &variables_in_lhs_of_parameter_mapping)
static action_list hide_(const identifier_string_list &hidelist, const action_list &multiaction)
process_expression pCRLrewrite(const process_expression &t)
data_expression_list pushdummy_regular_data_expressions(const variable_list &pars, const stacklisttype &stack)
void define_equations_for_case_function(const std::size_t index, const data::function_symbol &functionname, const sort_expression &sort)
void alphaconvert(variable_list &sumvars, MutableSubstitution &sigma, const variable_list &occurvars, const data_expression_list &occurterms)
bool canterminatebody(const process_expression &t)
data_expression transform_matching_list(const variable_list &matchinglist)
void add_summands(const process_identifier &procId, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, process_expression summandterm, const std::set< process_identifier > &pCRLprocs, const stacklisttype &stack, const bool regular, const bool singlestate, const variable_list &process_parameters)
bool isDeltaAtZero(const process_expression &t)
data::function_symbol find_case_function(std::size_t index, const sort_expression &sort) const
data_expression_list make_initialstate(const process_identifier &initialProcId, const stacklisttype &stack, const std::set< process_identifier > &pcrlprcs, const bool regular, const bool singlecontrolstate, const stochastic_distribution &initial_stochastic_distribution)
static bool summandsCanBeClustered(const stochastic_action_summand &summand1, const stochastic_action_summand &summand2)
static sort_expression_list getActionSorts(const action_list &actionlist)
void filter_vars_by_multiaction(const action_list &multiaction, const std::set< variable > &vars_set, std::set< variable > &vars_result_set)
stochastic_action_summand collect_sum_arg_arg_cond(const enumtype &e, std::size_t n, const stochastic_action_summand_vector &action_summands, const variable_list ¶meters)
static process_identifier get_last(const process_identifier &id, const std::map< process_identifier, process_identifier > &identifier_identifier_map)
static bool check_real_variable_occurrence(const variable_list &sumvars, const data_expression &actiontime, const data_expression &condition)
process_identifier newprocess(const variable_list ¶meters, const process_expression &body, const processstatustype ps, const bool canterminate, const bool containstime)
void make_pCRL_procs(const process_identifier &id, std::set< process_identifier > &reachable_process_identifiers)
void filter_vars_by_term(const data_expression &t, const std::set< variable > &vars_set, std::set< variable > &vars_result_set)
data_expression_list pushdummy_stack(const variable_list ¶meters, const stacklisttype &stack, const variable_list &stochastic_variables)
void procstorealGNFrec(const process_identifier &procIdDecl, const variableposition v, std::vector< process_identifier > &todo, const bool regular)
static action_label_list getnames(const process_expression &multiAction)
variable_list getparameters_rec(const process_expression &multiAction, std::set< variable > &occurs_set)
static int match_sequence(const std::vector< process_instance_assignment > &s1, const std::vector< process_instance_assignment > &s2, const bool regular2)
void detail_check_objectdata(const aterm &o) const
assignment_list argscollect_regular2(const process_expression &t, variable_list &vl)
void guarantee_that_parameters_have_unique_type(const process_identifier &procId, std::set< process_identifier > &visited_processes, std::set< identifier_string > &used_variable_names, maintain_variables_in_rhs< mutable_map_substitution<> > ¶meter_mapping, std::set< variable > &variables_in_lhs_of_parameter_mapping)
bool fresh_equation_added
void calculate_left_merge_action(const lps::detail::ultimate_delay &ultimate_delay_condition, const stochastic_action_summand_vector &action_summands1, const action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands)
process_expression split_body(const process_expression &t, std::map< process_identifier, process_identifier > &visited_id, std::map< process_expression, process_expression > &visited_proc, const variable_list ¶meters)
void parallelcomposition(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const variable_list &pars1, const data_expression_list &init1, const stochastic_distribution &initial_stochastic_distribution1, const lps::detail::ultimate_delay &ultimate_delay_condition1, const stochastic_action_summand_vector &action_summands2, const deadlock_summand_vector &deadlock_summands2, const variable_list &pars2, const data_expression_list &init2, const stochastic_distribution &initial_stochastic_distribution2, const lps::detail::ultimate_delay &ultimate_delay_condition2, const action_name_multiset_list &allowlist1, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, variable_list &pars_result, data_expression_list &init_result, stochastic_distribution &initial_stochastic_distribution, lps::detail::ultimate_delay &ultimate_delay_condition)
bool occursintermlist(const variable &var, const assignment_list &r, const process_identifier &proc_name) const
void transform_process_arguments(const process_identifier &procId)
objectdatatype & insert_process_declaration(const process_identifier &procId, const variable_list ¶meters, const process_expression &body, processstatustype s, const bool canterminate, const bool containstime)
static void set_proc_identifier_map(std::map< process_identifier, process_identifier > &identifier_identifier_map, const process_identifier &id1_, const process_identifier &id2_, const process_identifier &initial_process)
bool canterminate_rec(const process_identifier &procId, bool &stable, std::set< process_identifier > &visited)
set_identifier_generator fresh_identifier_generator
std::set< process_identifier > remove_stochastic_operators_from_front(const std::set< process_identifier > &reachable_process_identifiers, process_identifier &initial_process_id, stochastic_distribution &initial_stochastic_distribution)
void filter_vars_by_termlist(Iterator begin, const Iterator &end, const std::set< variable > &vars_set, std::set< variable > &vars_result_set)
bool searchProcDeclaration(const variable_list ¶meters, const process_expression &body, const processstatustype s, const bool canterminate, const bool containstime, process_identifier &p) const
process_identifier splitmCRLandpCRLprocsAndAddTerminatedAction(const process_identifier &procId)
action_list linMergeMultiActionListProcess(const process_expression &ma1, const process_expression &ma2)
void guarantee_that_parameters_have_unique_type(const process_identifier &procId)
std::vector< process_equation > procs
action_list adapt_multiaction_to_stack(const action_list &multiAction, const stacklisttype &stack, const variable_list &vars)
void determinewhetherprocessescanterminate(const process_identifier &procId)
process_expression distribute_condition(const process_expression &body1, const data_expression &condition)
bool containstime_rec(const process_identifier &procId, bool *stable, std::set< process_identifier > &visited, bool &contains_if_then)
void collectsumlist(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const std::set< process_identifier > &pCRLprocs, const variable_list &pars, const stacklisttype &stack, bool regular, bool singlestate)
data_expression correctstatecond(const process_identifier &procId, const std::set< process_identifier > &pCRLproc, const stacklisttype &stack, int regular)
void calculate_communication_merge_action_summands(const stochastic_action_summand_vector &action_summands1, const stochastic_action_summand_vector &action_summands2, const action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands)
processstatustype determine_process_statusterm(const process_expression &body, const processstatustype status)
void calculate_communication_merge_action_deadlock_summands(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
data_expression getvar(const variable &var, const stacklisttype &stack) const
variable_list initdatavars
void find_free_variables_process(const process_expression &p, std::set< variable > &free_variables_in_p)
lps::detail::ultimate_delay combine_ultimate_delays(const lps::detail::ultimate_delay &delay1, const lps::detail::ultimate_delay &delay2)
Returns the conjunction of the two delay conditions and the join of the variables,...
process_expression distributeTime(const process_expression &body, const data_expression &time, const variable_list &freevars, data_expression &timecondition)
data_expression_list pushdummyrec_stack(const variable_list &totalpars, const variable_list &pars, const stacklisttype &stack, const variable_list &stochastic_variables)
static action_list to_action_list(const process_expression &p)
void combine_summand_lists(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const lps::detail::ultimate_delay &ultimate_delay_condition1, const stochastic_action_summand_vector &action_summands2, const deadlock_summand_vector &deadlock_summands2, const lps::detail::ultimate_delay &ultimate_delay_condition2, const variable_list &par1, const variable_list &par3, const action_name_multiset_list &allowlist1, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
process_expression cut_off_unreachable_tail(const process_expression &t)
std::vector< enumeratedtype > enumeratedtypes
data_expression find_(const variable &s, const assignment_list &args, const stacklisttype &stack, const variable_list &vars, const std::set< variable > &free_variables_in_body, const variable_list &stochastic_variables)
process::action_label_list acts
assignment_list make_procargs_regular(const process_expression &t, const stacklisttype &stack, const std::set< process_identifier > &pcrlprcs, const bool singlestate, const variable_list &stochastic_variables)
static void hidecomposition(const identifier_string_list &hidelist, stochastic_action_summand_vector &action_summands)
std::size_t create_enumeratedtype(const std::size_t n)
void generateLPEmCRL(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process_identifier &procIdDecl, const bool regular, variable_list &pars, data_expression_list &init, stochastic_distribution &initial_stochastic_distribution, lps::detail::ultimate_delay &ultimate_delay_condition)
process_instance_assignment expand_process_instance_assignment(const process_instance_assignment &t)
static process_expression delta_at_zero()
assignment_list rewrite_assignments(const assignment_list &t)
assignment_list push_regular(const process_identifier &procId, const assignment_list &args, const stacklisttype &stack, const std::set< process_identifier > &pCRLprocs, bool singlestate, const variable_list &stochastic_variables)
void transform_process_arguments(const process_identifier &procId, std::set< process_identifier > &visited_processes)
std::set< process_identifier > minimize_set_of_reachable_process_identifiers(const std::set< process_identifier > &reachable_process_identifiers, const process_identifier &initial_process)
void collectPcrlProcesses(const process_identifier &procDecl, std::vector< process_identifier > &pcrlprocesses, std::set< process_identifier > &visited)
variable_list make_binary_sums(std::size_t n, const sort_expression &enumtypename, data_expression &condition, const variable_list &tail)
variable_list SieveProcDataVarsAssignments(const std::set< variable > &vars, const data_expression_list &initial_state_expressions)
data_expression_list extend_conditions(const variable &var, const data_expression_list &conditionlist)
bool check_valid_process_instance_assignment(const process_identifier &id, const assignment_list &assignments)
static variable_list joinparameters(const variable_list &par1, const variable_list &par2)
void calculate_left_merge_deadlock(const lps::detail::ultimate_delay &ultimate_delay_condition, const deadlock_summand_vector &deadlock_summands1, const bool is_allow, const bool is_block, const stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
void addString(const identifier_string &str)
void procstovarheadGNF(const std::vector< process_identifier > &procs)
static process_expression action_list_to_process(const action_list &ma)
process_expression distribute_sum_over_a_stochastic_operator(const variable_list &sumvars, const variable_list &stochastic_variables, const data_expression &distribution, const process_expression &body)
variable_list collectparameterlist(const std::set< process_identifier > &pCRLprocs)
void alphaconvertprocess(variable_list &sumvars, MutableSubstitution &sigma, const process_expression &p)
process_expression obtain_initial_distribution_term(const process_expression &t)
data_expression push_stack(const process_identifier &procId, const assignment_list &args, const data_expression_list &t2, const stacklisttype &stack, const std::set< process_identifier > &pCRLprocs, const variable_list &vars, const variable_list &stochastic_variables)
void calculate_left_merge(const stochastic_action_summand_vector &action_summands1, const deadlock_summand_vector &deadlock_summands1, const lps::detail::ultimate_delay &ultimate_delay_condition2, const action_name_multiset_list &allowlist, const bool is_allow, const bool is_block, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
bool stochastic_operator_is_being_used
void declare_control_state(const std::set< process_identifier > &pCRLprocs)
void create_case_function_on_enumeratedtype(const sort_expression &sort, const std::size_t enumeratedtype_index)
variable_list SieveProcDataVarsSummands(const std::set< variable > &vars, const stochastic_action_summand_vector &action_summands, const deadlock_summand_vector &deadlock_summands, const variable_list ¶meters)
static data_expression_list extend(const data_expression &c, const data_expression_list &cl)
specification_basic_type & operator=(const specification_basic_type &)=delete
static bool occursinvarandremove(const variable &var, variable_list &vl)
process_expression bodytovarheadGNF(const process_expression &body, const state s, const variable_list &freevars, const variableposition v, const std::set< variable > &variables_bound_in_sum)
process_identifier terminatedProcId
process_expression distribute_sum(const variable_list &sumvars, const process_expression &body1)
data_expression variables_are_equal_to_default_values(const variable_list &vl)
void procstorealGNF(const process_identifier &procsIdDecl, const bool regular)
static bool check_assignment_list(const assignment_list &assignments, const variable_list ¶meters)
data_expression RewriteTerm(const data_expression &t)
void alphaconversion(const process_identifier &procId, const variable_list ¶meters)
bool all_equal(const atermpp::term_list< T > &l)
static bool alreadypresent(variable &var, const variable_list &vl)
void cluster_actions(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const variable_list &pars)
process_expression transform_initial_distribution_term(const process_expression &t, const std::map< process_identifier, process_pid_pair > &processes_with_initial_distribution)
process_expression create_regular_invocation(process_expression sequence, std::vector< process_identifier > &todo, const variable_list &freevars, const std::set< variable > &variables_bound_in_sum)
process_expression transform_process_arguments_body(const process_expression &t, const std::set< variable > &bound_variables, std::set< process_identifier > &visited_processes)
static assignment_list parameters_to_assignment_list(const variable_list ¶meters, const std::set< variable > &variables_bound_in_sum)
assignment_list dummyparameterlist(const stacklisttype &stack, const bool singlestate)
mcrl2::data::rewriter rewr
void make_pCRL_procs(const process_expression &t, std::set< process_identifier > &reachable_process_identifiers)
stackoperations * stack_operations_list
process_expression wraptime(const process_expression &body, const data_expression &time, const variable_list &freevars)
process_identifier split_process(const process_identifier &procId, std::map< process_identifier, process_identifier > &visited_id, std::map< process_expression, process_expression > &visited_proc)
bool mergeoccursin(variable &var, const variable_list &v, variable_list &matchinglist, variable_list &pars, data_expression_list &args, const variable_list &process_parameters)
static bool occursintermlist(const variable &var, const data_expression_list &r)
bool exists_variable_for_sequence(const std::vector< process_instance_assignment > &process_names, process_identifier &result)
std::set< variable > find_free_variables_process(const process_expression &p)
process_expression alphaconversionterm(const process_expression &t, const variable_list ¶meters, maintain_variables_in_rhs< mutable_map_substitution<> > sigma)
process_expression putbehind(const process_expression &body1, const process_expression &body2)
std::vector< std::vector< process_instance_assignment > > representedprocesses
assignment_list substitute_assignmentlist(const assignment_list &assignments, const variable_list ¶meters, const bool replacelhs, const bool replacerhs, Substitution &sigma)
process_instance_assignment transform_process_instance_to_process_instance_assignment(const process_instance &procId, const std::set< variable > &bound_variables=std::set< variable >())
process_instance_assignment RewriteProcess(const process_instance_assignment &t)
process_identifier delta_process
objectdatatype & objectIndex(const aterm &o)
void insert_summand(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const variable_list &sumvars, const data_expression &condition, const action_list &multiAction, const data_expression &actTime, const stochastic_distribution &distribution, const assignment_list &procargs, const bool has_time, const bool is_deadlock_summand)
variable_list parameters_that_occur_in_body(const variable_list ¶meters, const process_expression &body)
process_expression enumerate_distribution_and_sums(const variable_list &sumvars, const variable_list &stochvars, const data_expression &distribution, const process_expression &body)
bool containstimebody(const process_expression &t)
assignment_list make_procargs(const process_expression &t, const stacklisttype &stack, const std::set< process_identifier > &pcrlprcs, const variable_list &vars, const bool regular, const bool singlestate, const variable_list &stochastic_variables)
data_expression adapt_term_to_stack(const data_expression &t, const stacklisttype &stack, const variable_list &vars, const variable_list &stochastic_variables)
data_expression_list processencoding(std::size_t i, const data_expression_list &t1, const stacklisttype &stack)
process_expression RewriteMultAct(const process_expression &t)
void generateLPEmCRLterm(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, const process_expression &t, const bool regular, const bool rename_variables, variable_list &pars, data_expression_list &init, stochastic_distribution &initial_stochastic_distribution, lps::detail::ultimate_delay &ultimate_delay_condition)
Linearise a process indicated by procIdDecl.
~specification_basic_type()
variable_list make_pars(const sort_expression_list &sortlist)
specification_basic_type(const specification_basic_type &)=delete
static data_expression real_times_optimized(const data_expression &r1, const data_expression &r2)
bool occursinpCRLterm(const variable &var, const process_expression &p, const bool strict)
void collectPcrlProcesses(const process_identifier &procDecl, std::vector< process_identifier > &pcrlprocesses)
static std::size_t upperpowerof2(std::size_t i)
void extract_names(const process_expression &sequence, std::vector< process_instance_assignment > &result)
std::map< aterm, objectdatatype > objectdata
action RewriteAction(const action &t)
data_expression_vector adapt_termlist_to_stack(Iterator begin, const Iterator &end, const stacklisttype &stack, const variable_list &vars, const variable_list &stochastic_variables)
data_expression make_procargs_stack(const process_expression &t, const stacklisttype &stack, const std::set< process_identifier > &pcrlprcs, const variable_list &vars, const variable_list &stochastic_variables)
specification_basic_type(const process::action_label_list &as, const std::vector< process_equation > &ps, const variable_list &idvs, const data_specification &ds, const std::set< data::variable > &glob_vars, const t_lin_options &opt, const process_specification &procspec)
variable_list getparameters(const process_expression &multiAction)
data_expression makesingleultimatedelaycondition(const variable_list &sumvars, const variable_list &freevars, const data_expression &condition, const bool has_time, const variable &timevariable, const data_expression &actiontime, variable_list &used_sumvars)
void collectPcrlProcesses_term(const process_expression &body, std::vector< process_identifier > &pcrlprocesses, std::set< process_identifier > &visited)
data_expression representative_generator_internal(const sort_expression &s, const bool allow_dont_care_var=true)
assignment_list processencoding(std::size_t i, const assignment_list &t1, const stacklisttype &stack)
objectdatatype & addMultiAction(const process_expression &multiAction, bool &isnew)
void storeprocs(const std::vector< process_equation > &procs)
process_expression substitute_pCRLproc(const process_expression &p, Substitution &sigma)
void make_parameters_and_sum_variables_unique(stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, variable_list &pars, lps::detail::ultimate_delay &ultimate_delay_condition, const std::string &hint="")
const std::set< variable > & get_free_variables(objectdatatype &object)
std::set< variable > global_variables
static data_expression getRHSassignment(const variable &var, const assignment_list &as)
variable_list construct_renaming(const variable_list &pars1, const variable_list &pars2, variable_list &pars3, variable_list &pars4, const bool unique=true)
void determine_process_status(const process_identifier &procDecl, const processstatustype status)
static action_list makemultiaction(const process::action_label_list &actionIds, const data_expression_list &args)
void insertvariables(const variable_list &vars, const bool mustbenew)
data_expression_list RewriteTermList(const data_expression_list &t)
variable_list make_parameters_rec(const data_expression_list &l, std::set< variable > &occurs_set)
static assignment_list filter_assignments(const assignment_list &assignments, const variable_list ¶meters)
variable_list merge_var(const variable_list &v1, const variable_list &v2, std::vector< variable_list > &renamings_pars, std::vector< data_expression_list > &renamings_args, data_expression_list &conditionlist, const variable_list &process_parameters)
bool containstimebody(const process_expression &t, bool *stable, std::set< process_identifier > &visited, bool allowrecursion, bool &contains_if_then)
static assignment_list sort_assignments(const assignment_list &ass, const variable_list ¶meters)
assignment_list find_dummy_arguments(const variable_list &parlist, const assignment_list &args, const std::set< variable > &free_variables_in_body, const variable_list &stochastic_variables)
process_identifier tau_process
static sort_expression_list get_sorts(const List &l)
std::vector< process_identifier > seq_varnames
void storeact(const process::action_label_list &acts)
bool is_global_variable(const data_expression &d) const
static bool occursin(const variable &name, const variable_list &pars)
bool canterminatebody(const process_expression &t, bool &stable, std::set< process_identifier > &visited, const bool allowrecursion)
void AddTerminationActionIfNecessary(const stochastic_action_summand_vector &summands)
bool determinewhetherprocessescontaintime(const process_identifier &procId)
void filter_vars_by_assignmentlist(const assignment_list &assignments, const variable_list ¶meters, const std::set< variable > &vars_set, std::set< variable > &vars_result_set)
data_expression_list addcondition(const variable_list &matchinglist, const data_expression_list &conditionlist)
void calculate_communication_merge_deadlock_summands(const deadlock_summand_vector &deadlock_summands1, const deadlock_summand_vector &deadlock_summands2, const stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands)
void transform(const process_identifier &init, stochastic_action_summand_vector &action_summands, deadlock_summand_vector &deadlock_summands, variable_list ¶meters, data_expression_list &initial_state, stochastic_distribution &initial_stochastic_distribution)
process_expression obtain_initial_distribution(const process_identifier &procId)
objectdatatype & insertAction(const action_label &actionId)
Expression replace_variables_capture_avoiding_alt(const Expression &e, Substitution &sigma)
process_instance_assignment expand_process_instance_assignment(const process_instance_assignment &t, std::set< process_identifier > &visited_processes)
assignment_list pushdummy_regular(const variable_list &pars, const stacklisttype &stack, const variable_list &stochastic_variables)
std::set< data::variable > sigma_variables(const SUBSTITUTION &sigma)
assignment_list argscollect_regular(const process_expression &t, const variable_list &vl, const std::set< variable > &variables_bound_in_sum)
static data_expression_list getarguments(const action_list &multiAction)
lps::detail::ultimate_delay getUltimateDelayCondition(const stochastic_action_summand_vector &action_summands, const deadlock_summand_vector &deadlock_summands, const variable_list &freevars)
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
The main namespace for the aterm++ library.
atermpp::term_list< identifier_string > identifier_string_list
\brief list of identifier_strings
atermpp::aterm_string identifier_string
String type of the LPS library. Identifier strings are represented internally as ATerms.
atermpp::function_symbol linear_inequality_equal()
const lhs_t map_to_lhs_type(const map_based_lhs_t &lhs)
void optimized_forall(typename TermTraits::term_type &result, const typename TermTraits::variable_sequence_type &v, const typename TermTraits::term_type &arg, bool remove_variables, bool empty_domain_allowed, TermTraits)
Make a universal quantification.
void split_condition(const data_expression &e, std::vector< data_expression_list > &real_conditions, std::vector< data_expression > &non_real_conditions)
This function first splits the given condition e into real conditions and non real conditions....
const lhs_t remove_variable_and_divide(const lhs_t &lhs, const variable &v, const data_expression &f, const rewriter &r)
data_expression negate_inequality(const data_expression &e)
const lhs_t subtract(const lhs_t &argument, const lhs_t &e, const rewriter &r)
const lhs_t map_to_lhs_type(const map_based_lhs_t &lhs, const data_expression &factor, const rewriter &r)
void optimized_exists(typename TermTraits::term_type &result, const typename TermTraits::variable_sequence_type &v, const typename TermTraits::term_type &arg, bool remove_variables, bool empty_domain_allowed, TermTraits)
Make an existential quantification.
void optimized_or(typename TermTraits::term_type &result, const typename TermTraits::term_type &left, const typename TermTraits::term_type &right, TermTraits)
Make a disjunction.
atermpp::function_symbol linear_inequality_less()
void emplace_back_if_not_zero(std::vector< detail::variable_with_a_rational_factor > &r, const variable &v, const data_expression &f)
std::string pp(const detail::comparison_t t)
variable_list set_intersection(const variable_list &x, const variable_list &y)
Returns the intersection of two unordered sets, that are stored in ATerm lists.
lhs_t set_factor_for_a_variable(const lhs_t &lhs, const variable &x, const data_expression &e)
void optimized_imp(typename TermTraits::term_type &result, const typename TermTraits::term_type &left, const typename TermTraits::term_type &right, TermTraits t)
Make an implication.
const lhs_t add(const data_expression &v, const lhs_t &argument, const rewriter &r)
const data_expression & else_part(const data_expression &e)
bool is_well_formed(const lhs_t &lhs)
bool is_inequality(const data_expression &e)
Determine whether a data expression is an inequality.
detail::comparison_t negate(const detail::comparison_t t)
const data_expression & condition_part(const data_expression &e)
std::map< variable, data_expression > map_based_lhs_t
const lhs_t add(const lhs_t &argument, const lhs_t &e, const rewriter &r)
atermpp::function_symbol linear_inequality_less_equal()
lhs_t meta_operation_lhs(const lhs_t &argument1, const lhs_t &argument2, OPERATION operation, const rewriter &r)
const lhs_t subtract(const lhs_t &argument, const data_expression &v, const rewriter &r)
std::string pp(const detail::lhs_t &lhs)
const lhs_t meta_operation_constant(const lhs_t &argument, const data_expression &v, const rewriter &r)
const data_expression & then_part(const data_expression &e)
void optimized_not(typename TermTraits::term_type &result, const typename TermTraits::term_type &arg, TermTraits)
static bool split_condition_aux(const data_expression &e, std::vector< data_expression_list > &real_conditions, std::vector< data_expression_list > &non_real_conditions, const bool negate=false)
Splits a condition in expressions ranging over reals and the others.
void set_factor_for_a_variable(detail::map_based_lhs_t &new_lhs, const variable &x, const data_expression &e)
variable_list set_difference(const variable_list &x, const variable_list &y)
Returns the difference of two unordered sets, that are stored in aterm lists.
void optimized_and(typename TermTraits::term_type &result, const typename TermTraits::term_type &left, const typename TermTraits::term_type &right, TermTraits)
Make a conjunction and optimize it if possible.
const lhs_t multiply(const lhs_t &argument, const data_expression &v, const rewriter &r)
atermpp::function_symbol f_variable_with_a_rational_factor()
const lhs_t divide(const lhs_t &argument, const data_expression &v, const rewriter &r)
A collection of utilities for lazy expression construction.
data_expression and_(data_expression const &p, data_expression const &q)
Returns an expression equivalent to p or q.
data_expression or_(data_expression const &p, data_expression const &q)
Returns an expression equivalent to p and q.
Namespace for system defined sort bool_.
bool is_or_application(const atermpp::aterm &e)
Recogniser for application of ||.
const basic_sort & bool_()
Constructor for sort expression Bool.
const data_expression & right(const data_expression &e)
Function for projecting out argument. right from an application.
bool is_implies_application(const atermpp::aterm &e)
Recogniser for application of =>.
application not_(const data_expression &arg0)
Application of function symbol !.
application or_(const data_expression &arg0, const data_expression &arg1)
Application of function symbol ||.
const function_symbol & false_()
Constructor for function symbol false.
bool is_and_application(const atermpp::aterm &e)
Recogniser for application of &&.
bool is_not_application(const atermpp::aterm &e)
Recogniser for application of !.
const function_symbol & true_()
Constructor for function symbol true.
const data_expression & left(const data_expression &e)
Function for projecting out argument. left from an application.
Namespace for system defined sort pos.
const basic_sort & pos()
Constructor for sort expression Pos.
Namespace for system defined sort real_.
function_symbol plus(const sort_expression &s0, const sort_expression &s1)
function_symbol times(const sort_expression &s0, const sort_expression &s1)
function_symbol divides(const sort_expression &s0, const sort_expression &s1)
data_expression & real_one()
bool is_plus_application(const atermpp::aterm &e)
Recogniser for application of +.
data_expression & real_zero()
function_symbol minus(const sort_expression &s0, const sort_expression &s1)
const basic_sort & real_()
Constructor for sort expression Real.
application times(const data_expression &arg0, const data_expression &arg1)
Application of function symbol *.
function_symbol abs(const sort_expression &s0)
bool is_times_application(const atermpp::aterm &e)
Recogniser for application of *.
function_symbol negate(const sort_expression &s0)
bool is_negate_application(const atermpp::aterm &e)
Recogniser for application of -.
bool is_minus_application(const atermpp::aterm &e)
Recogniser for application of -.
Namespace for all data library functionality.
linear_inequality subtract(const linear_inequality &e1, const linear_inequality &e2, const data_expression &f1, const data_expression &f2, const rewriter &r)
Subtract the given equality, multiplied by f1/f2. The result is e1-(f1/f2)e2,.
std::vector< assignment > assignment_vector
\brief vector of assignments
application real_times(const data_expression &arg0, const data_expression &arg1)
data_expression & real_one()
void optimized_exists_no_empty_domain(Term &result, const VariableSequence &l, const Term &p, bool remove_variables=false)
Make an existential quantification.
void optimized_exists(Term &result, const VariableSequence &l, const Term &p, bool remove_variables=false)
Make an existential quantification.
bool is_closed_real_number(const data_expression &e)
bool is_application(const data_expression &t)
Returns true if the term t is an application.
application real_plus(const data_expression &arg0, const data_expression &arg1)
atermpp::term_list< function_symbol > function_symbol_list
\brief list of function_symbols
data_expression & real_minus_one()
void optimized_or(Term &result, const Term &p, const Term &q)
Make a conjunction, and optimize if possible.
bool is_positive(const data_expression &e, const rewriter &r)
bool is_where_clause(const atermpp::aterm &x)
Returns true if the term t is a where clause.
application less_equal(const data_expression &arg0, const data_expression &arg1)
Application of function symbol <=.
std::string pp(const data::variable &x)
application real_abs(const data_expression &arg)
void count_occurrences(const std::vector< linear_inequality > &inequalities, std::map< variable, std::size_t > &nr_positive_occurrences, std::map< variable, std::size_t > &nr_negative_occurrences, const rewriter &r)
application less(const data_expression &arg0, const data_expression &arg1)
Application of function symbol <.
std::string pp_vector(const TYPE &inequalities)
Print the vector of inequalities to stderr in readable form.
bool is_abstraction(const atermpp::aterm &x)
Returns true if the term t is an abstraction.
std::vector< variable > variable_vector
\brief vector of variables
application if_(const data_expression &arg0, const data_expression &arg1, const data_expression &arg2)
Application of function symbol if.
void remove_redundant_inequalities(const std::vector< linear_inequality > &inequalities, std::vector< linear_inequality > &resulting_inequalities, const rewriter &r)
Remove every redundant inequality from a vector of inequalities.
application real_minus(const data_expression &arg0, const data_expression &arg1)
atermpp::term_list< sort_expression > sort_expression_list
\brief list of sort_expressions
std::vector< data_expression > data_expression_vector
\brief vector of data_expressions
static void pivot_and_update(const variable &xi, const variable &xj, const data_expression &v, const data_expression &v_delta_correction, std::map< variable, data_expression > &beta, std::map< variable, data_expression > &beta_delta_correction, std::set< variable > &basic_variables, std::map< variable, detail::lhs_t > &working_equalities, const rewriter &r)
void fourier_motzkin(const data_expression &e_in, const variable_list &vars_in, data_expression &e_out, variable_list &vars_out, const rewriter &r)
Eliminate variables from a data expression using Gauss elimination and Fourier-Motzkin elimination.
std::string pp(const linear_inequality &l)
application real_divides(const data_expression &arg0, const data_expression &arg1)
std::set< variable > gauss_elimination(const std::vector< linear_inequality > &inequalities, std::vector< linear_inequality > &resulting_equalities, std::vector< linear_inequality > &resulting_inequalities, Variable_iterator variables_begin, Variable_iterator variables_end, const rewriter &r)
Try to eliminate variables from a system of inequalities using Gauss elimination.
void optimized_imp(Term &result, const Term &p, const Term &q)
Make an implication.
std::vector< structured_sort_constructor > structured_sort_constructor_vector
\brief vector of structured_sort_constructors
bool is_zero(const data_expression &e)
bool is_forall(const atermpp::aterm &x)
Returns true if the term t is a universal quantification.
bool is_function_symbol(const atermpp::aterm &x)
Returns true if the term t is a function symbol.
void fourier_motzkin(const std::vector< linear_inequality > &inequalities_in, Data_variable_iterator variables_begin, Data_variable_iterator variables_end, std::vector< linear_inequality > &resulting_inequalities, const rewriter &r)
atermpp::term_list< data_expression > data_expression_list
\brief list of data_expressions
data_expression rewrite_with_memory(const data_expression &t, const rewriter &r)
data_expression & real_zero()
bool is_a_redundant_inequality(const std::vector< linear_inequality > &inequalities, const std::vector< linear_inequality > ::iterator i, const rewriter &r)
Indicate whether an inequality from a set of inequalities is redundant.
application greater(const data_expression &arg0, const data_expression &arg1)
Application of function symbol >
void optimized_forall_no_empty_domain(Term &result, const VariableSequence &l, const Term &p, bool remove_variables=false)
Make a universal quantification.
atermpp::term_list< variable > variable_list
\brief list of variables
bool is_exists(const atermpp::aterm &x)
Returns true if the term t is an existential quantification.
application real_negate(const data_expression &arg)
atermpp::term_list< assignment > assignment_list
\brief list of assignments
bool is_inconsistent(const std::vector< linear_inequality > &inequalities_in, const rewriter &r, const bool use_cache=true)
Determine whether a list of data expressions is inconsistent.
std::string pp(const data::sort_expression &x)
data_expression max(const data_expression &e1, const data_expression &e2, const rewriter &)
bool is_machine_number(const atermpp::aterm &x)
Returns true if the term t is a machine_number.
bool is_negative(const data_expression &e, const rewriter &r)
const data_expression_list & variable_list_to_data_expression_list(const variable_list &l)
Transform a variable_list into a data_expression_list.
application equal_to(const data_expression &arg0, const data_expression &arg1)
Application of function symbol ==.
void optimized_not(Term &result, const Term &arg)
Make a negation.
void optimized_and(Term &result, const Term &p, const Term &q)
Make a conjunction, and optimize if possible.
data_expression min(const data_expression &e1, const data_expression &e2, const rewriter &)
std::vector< function_symbol > function_symbol_vector
\brief vector of function_symbols
std::vector< structured_sort_constructor_argument > structured_sort_constructor_argument_vector
\brief vector of structured_sort_constructor_arguments
void optimized_forall(Term &result, const VariableSequence &l, const Term &p, bool remove_variables=false)
Make a universal quantification.
std::string pp(const data::data_expression &x)
bool is_variable(const atermpp::aterm &x)
Returns true if the term t is a variable.
atermpp::term_list< structured_sort_constructor > structured_sort_constructor_list
\brief list of structured_sort_constructors
bool mCRL2logEnabled(const log_level_t level)
The main namespace for the LPS library.
void complete_data_specification(stochastic_specification &spec)
Adds all sorts that appear in the process of l to the data specification of l.
std::vector< stochastic_action_summand > stochastic_action_summand_vector
\brief vector of stochastic_action_summands
bool occursinterm(const data::data_expression &t, const data::variable &var)
std::vector< deadlock_summand > deadlock_summand_vector
\brief vector of deadlock_summands
mcrl2::lps::stochastic_specification linearise(const mcrl2::process::process_specification &type_checked_spec, const mcrl2::lps::t_lin_options &lin_options=t_lin_options())
Linearises a process specification.
void rename(const process::rename_expression_list &renamings, lps::stochastic_action_summand_vector &action_summands)
The main namespace for the Process library.
bool is_at(const atermpp::aterm &x)
bool is_process_instance(const atermpp::aterm &x)
bool is_process_instance_assignment(const atermpp::aterm &x)
bool is_tau(const atermpp::aterm &x)
bool is_seq(const atermpp::aterm &x)
bool is_merge(const atermpp::aterm &x)
bool is_allow(const atermpp::aterm &x)
std::string pp(const process::process_identifier &x)
bool is_bounded_init(const atermpp::aterm &x)
bool is_delta(const atermpp::aterm &x)
bool is_sum(const atermpp::aterm &x)
bool is_process_identifier(const atermpp::aterm &x)
bool is_block(const atermpp::aterm &x)
bool is_if_then_else(const atermpp::aterm &x)
bool is_comm(const atermpp::aterm &x)
void alphabet_reduce(process_specification &procspec, std::size_t duplicate_equation_limit=(std::numeric_limits< size_t >::max)())
Applies alphabet reduction to a process specification.
bool is_action(const atermpp::aterm &x)
bool is_left_merge(const atermpp::aterm &x)
atermpp::term_list< action_label > action_label_list
\brief list of action_labels
std::vector< action > action_vector
\brief vector of actions
atermpp::term_list< action > action_list
\brief list of actions
bool is_hide(const atermpp::aterm &x)
std::string pp(const process::process_expression &x)
bool is_if_then(const atermpp::aterm &x)
bool is_choice(const atermpp::aterm &x)
bool is_stochastic_operator(const atermpp::aterm &x)
atermpp::term_list< action_name_multiset > action_name_multiset_list
\brief list of action_name_multisets
bool is_rename(const atermpp::aterm &x)
bool is_sync(const atermpp::aterm &x)
std::string pp(const process::action_label &x)
void swap(atermpp::aterm &t1, atermpp::aterm &t2) noexcept
Swaps two term_applss.
Contains type information for terms.
A unary function that can be used in combination with replace_data_expressions to eliminate real numb...
fourier_motzkin_sigma(const rewriter &rewr_)
const data_expression operator()(const data_expression &d) const
const data_expression apply(const abstraction &d, bool negate) const
Options for linearisation.
bool apply_alphabet_axioms
make_substitution(const std::map< process_identifier, process_identifier > &map)
process_identifier result_type
process_identifier argument_type
process_identifier operator()(const process_identifier &id) const
const std::map< process_identifier, process_identifier > & m_map
std::size_t operator()(const atermpp::detail::reference_aterm< T > &t) const