12#ifndef MCRL2_PBES_ABSINTHE_H
13#define MCRL2_PBES_ABSINTHE_H
15#include "mcrl2/atermpp/aterm.h"
16#include "mcrl2/data/data_expression.h"
17#include "mcrl2/data/consistency.h"
18#include "mcrl2/data/detail/data_construction.h"
19#include "mcrl2/pbes/builder.h"
20#include "mcrl2/utilities/detail/separate_keyword_section.h"
21#include "mcrl2/data/detail/print_parse_check.h"
26template <
typename Term>
29 return data::pp(x) +
" " + data::pp(x);
32 template <
typename Term>
35 return data::pp(x) +
": " + data::pp(x.sort());
57 for (
const data::alias& a: dataspec.user_defined_aliases())
59 if (f.sort() != a.name())
63 const data::sort_expression& s = a.reference();
64 if (data::is_structured_sort(s))
66 const auto& ss = atermpp::down_cast<data::structured_sort>(s);
67 for (
const data::function_symbol& g: ss.constructor_functions())
69 if (f.name() == g.name())
82 mCRL2log(log::debug) <<
"--- used function symbols ---" << std::endl;
83 for (
const data::function_symbol& f: pbes_system::find_function_symbols(p))
85 mCRL2log(log::debug) << print_symbol(f) << std::endl;
99 const auto& fs = atermpp::down_cast<data::function_sort>(s);
100 return fs.codomain();
106 throw mcrl2::runtime_error(
"target_sort: unsupported sort " + print_term(s) +
" detected!");
132 const sort_expression_substitution_map& sigmaS_,
133 const function_symbol_substitution_map& sigmaF_,
145 auto i = sigmaS.find(x);
146 if (i == sigmaS.end())
148 super::apply(result, x);
159 auto i = sigmaF.find(x);
160 if (i != sigmaF.end())
165 throw mcrl2::runtime_error(
"function symbol " + print_symbol(x) +
" not present in the function symbol mapping!");
173 data::
variable v = atermpp::down_cast<data::variable>(x.head());
175 super::apply(sort, v.sort());
182 super::apply(result, x);
187 throw mcrl2::runtime_error(
"don't know how to handle arbitrary expression as head: " + data::pp(x));
195 super::apply(body, x);
207 super::apply(result, x);
213 auto i = sigmaH.find(x.sort());
214 if (i != sigmaH.end() && data::find_all_variables(x).empty())
216 data::data_expression_list args = { x };
217 result = data::detail::create_finite_set(data::application(i->second, args));
222 super::apply(result, x);
237 const sort_expression_substitution_map& sigmaS,
238 const function_symbol_substitution_map& sigmaF,
260 std::vector<data::variable> result;
262 for (
auto j = x.begin(); j != x.end(); ++i, ++j)
264 result.emplace_back(hint + utilities::number2string(i), sigma(j->sort()));
266 return data::variable_list(result.begin(), result.end());
278 absinthe_sort_expression_builder(sigmaH, sigmaS, sigmaF, generator).apply(result, x);
284 data::data_expression_list result;
285 absinthe_sort_expression_builder(sigmaH, sigmaS, sigmaF, generator).apply(result, x);
291 data::variable_list result;
292 absinthe_sort_expression_builder(sigmaH, sigmaS, sigmaF, generator).apply(result, x);
299 absinthe_sort_expression_builder(sigmaH, sigmaS, sigmaF, generator).apply(result, x);
304 const sort_expression_substitution_map& sigmaS_,
305 const function_symbol_substitution_map& sigmaF_,
307 bool is_over_approximation)
321 result = atermpp::down_cast<T>(data::detail::create_set_in(data::true_(), x1));
325 result = atermpp::down_cast<T>(data::not_(data::detail::create_set_in(data::false_(), x1)));
332 data::data_expression_list e = lift(x.parameters());
333 data::variable_list variables = make_variables(x.parameters(),
"x", sort_function(sigmaH, sigmaS, sigmaF, generator));
334 data::data_expression_list::iterator i = e.begin();
335 data::variable_list::iterator j = variables.begin();
336 data::data_expression_vector z;
337 for (; i != e.end(); ++i, ++j)
339 z.push_back(data::detail::create_set_in(*j, *i));
344 result = make_exists_(variables, and_(atermpp::down_cast<pbes_expression>(q),
345 propositional_variable_instantiation(x.name(), data::data_expression_list(variables))));
349 result = make_forall_(variables, imp(atermpp::down_cast<pbes_expression>(q), propositional_variable_instantiation(x.name(), data::data_expression_list(variables))));
357 super::apply(body, x.body());
365 super::apply(body, x.body());
373 super::apply(result, x.formula());
379 super::update(x.equations());
382 core::identifier_string name(
"GeneratedZ");
391 sort_expression_substitution_map result;
393 for (
const std::string& line: utilities::regex_split(text,
"\\n"))
395 std::vector<std::string> words = utilities::regex_split(line,
":=");
396 if (words.size() == 2)
398 data::sort_expression lhs = data::parse_sort_expression(words[0], dataspec);
399 data::sort_expression rhs = data::parse_sort_expression(words[1], dataspec);
409 std::string dataspec_text = data::pp(dataspec);
410 for (
const std::string& line: utilities::regex_split(text,
"\\n"))
412 std::vector<std::string> words = utilities::regex_split(line,
":=");
413 if (words.size() == 2)
415 data::function_symbol f = data::parse_function_symbol(words[1], dataspec_text);
416 if (!pbes_system::detail::is_structured_sort_constructor(dataspec, f))
418 dataspec.add_mapping(f);
426 function_symbol_substitution_map result;
427 std::string dataspec_text = data::pp(dataspec);
429 for (
const std::string& line: utilities::regex_split(text,
"\\n"))
431 std::vector<std::string> words = utilities::regex_split(line,
":=");
432 if (words.size() == 2)
434 data::function_symbol lhs = data::parse_function_symbol(words[0], dataspec_text);
435 std::string s = words[1];
436 s = utilities::regex_replace(
";\\s*$",
"", s);
437 data::function_symbol rhs = data::parse_function_symbol(s, dataspec_text);
447 abstraction_map result;
449 for (
const data::function_symbol& i: dataspec.user_defined_mappings())
451 const auto& f = atermpp::down_cast<data::function_sort>(i.sort());
452 if (f.domain().size() != 1)
454 throw mcrl2::runtime_error(
"cannot abstract the function " + data::pp(i) +
" since the arity of the domain is not equal to one!");
456 result[f.domain().front()] = i;
490 unprintable[
"&&"] =
"and";
491 unprintable[
"||"] =
"or";
492 unprintable[
"!"] =
"not";
493 unprintable[
"#"] =
"len";
494 unprintable[
"."] =
"element_at";
495 unprintable[
"+"] =
"plus";
496 unprintable[
"-"] =
"minus";
497 unprintable[
">"] =
"greater";
498 unprintable[
"<"] =
"less";
499 unprintable[
">="] =
"ge";
500 unprintable[
"<="] =
"le";
501 unprintable[
"=="] =
"eq";
502 unprintable[
"!="] =
"neq";
503 unprintable[
"[]"] =
"emptylist";
504 unprintable[
"++"] =
"concat";
505 unprintable[
"<|"] =
"snoc";
506 unprintable[
"|>"] =
"cons";
507 unprintable[
"@cNat"] =
"cNat";
508 unprintable[
"@cDub"] =
"cDub";
509 unprintable[
"@c0"] =
"c0";
510 unprintable[
"@c1"] =
"c1";
511 unprintable[
"@func_update"] =
"func_update";
512 unprintable[
"@cInt"] =
"cInt";
513 unprintable[
"@cNeg"] =
"cNeg";
514 unprintable[
"@most_significant_digit"] =
"most_significant_digit";
515 unprintable[
"@succ_pos"] =
"succpos";
516 unprintable[
"@most_significant_digitNat"] =
"most_significant_digitNat";
517 unprintable[
"@concat_digit"] =
"concat_digit";
518 unprintable[
"@succ_nat"] =
"succ_nat";
521 suffix_with_sort.insert(
"[]");
522 suffix_with_sort.insert(
"|>");
527 std::string result = data::pp(s);
528 result = utilities::regex_replace(
"\\(",
"_", result);
529 result = utilities::regex_replace(
"\\)",
"_", result);
530 result = utilities::regex_replace(
"#",
"_", result);
531 result = utilities::regex_replace(
"->",
"_", result);
532 result = utilities::remove_whitespace(result);
541 std::string name = std::string(f.name());
543 bool print_sort = contains(suffix_with_sort, std::string(f.name()));
544 auto i = unprintable.find(name);
545 if (i != unprintable.end())
549 name =
"Generated_" + name;
552 name = name + print_cleaned(f.sort());
558 return data::function_symbol(name, sigma(s));
566 return data::function_symbol(name, data::function_sort(fs.domain(), make_set()(fs.codomain())));
572 return data::function_symbol(name, sigma(s));
574 throw mcrl2::runtime_error(
"absinthe algorithm: unsupported sort " + print_term(s) +
" detected!");
584 using namespace data;
585 std::string name =
"Lift" + utilities::trim_copy(std::string(f.name()));
589 return function_symbol(name, make_set()(s));
593 const auto& fs = atermpp::down_cast<data::function_sort>(s);
594 const sort_expression_list& sl = fs.domain();
595 return function_symbol(name, function_sort(sort_expression_list(sl.begin(),sl.end(), make_set()), fs.codomain()));
599 return data::function_symbol(name, make_set()(s));
601 throw mcrl2::runtime_error(
"absinthe algorithm (lift): unsupported sort " + print_term(s) +
" detected!");
612 std::vector<data::variable> result;
614 for (
auto j = sorts.begin(); j != sorts.end(); ++i, ++j)
616 result.emplace_back(hint + utilities::number2string(i), sigma(*j));
624 mCRL2log(log::debug) <<
"lift_equation_1_2 f1 = " << print_symbol(f1) <<
" f2 = " << print_symbol(f2) << std::endl;
625 data::variable_list variables;
637 auto i = sigmaH.find(f1.sort());
638 if (i == sigmaH.end())
645 rhs
= data::application(h, f1);
660 throw std::runtime_error(
"can not generalize functions with abstraction sorts in the domain: " + data::pp(f1) +
": " + data::pp(s1));
663 data::variable_vector x = make_variables(fs2.domain(),
"x", sigma);
664 variables = data::variable_list(x.begin(),x.end());
665 lhs = data::application(f2, x.begin(), x.end());
666 data::application f_x(f1, x.begin(), x.end());
670 auto i = sigmaH.find(detail::target_sort(f1.sort()));
671 if (i == sigmaH.end())
673 data::application f1_sigma_x(f1_sigma, x.begin(), x.end());
695 throw mcrl2::runtime_error(
"absinthe algorithm (lift_equation_1_2): unsupported sort " + print_term(s1) +
" detected!");
700 throw mcrl2::runtime_error(
"absinthe algorithm (lift_equation_1_2): lhs.sort() and rhs.sort are not equal: " + data::pp(lhs.sort()) +
" <-> " + data::pp(rhs.sort()));
703 return data::data_equation(variables, condition, lhs, rhs);
714 std::vector<data::variable> result;
716 for (
auto j = sorts.begin(); j != sorts.end(); ++i, ++j)
718 result.emplace_back(hint + utilities::number2string(i), sigma(*j));
728 std::vector<data::data_expression> a;
731 for (; i != x.end(); ++i, ++j)
733 a.push_back(data::detail::create_set_in(*i, *j));
741 data::variable_list variables;
760 throw mcrl2::runtime_error(
"The codomain " + data::pp(fs2.codomain()) +
" of function " + data::pp(f2.name()) +
" should be a container sort!");
764 std::vector<data::variable> x = make_variables(fs2.domain(),
"x", sigma);
765 std::vector<data::variable> X = make_variables(fs3.domain(),
"X", sigma);
767 variables = data::variable_list(X.begin(), X.end());
768 lhs = data::application(f3, X.begin(), X.end());
769 data::
variable y(
"y", data::detail::get_set_sort(atermpp::down_cast<data::container_sort>(fs2.codomain())));
771 data::
data_expression body = data::and_(enumerate_domain(x, X), data::detail::create_set_in(y, Y));
772 rhs = data::detail::create_set_comprehension(y, data::exists(x, body));
781 throw mcrl2::runtime_error(
"absinthe algorithm (lift_equation_2_3): unsupported sort " + print_term(s2) +
" detected!");
783 return data::data_equation(variables, condition, lhs, rhs);
787 template <
typename Map>
790 std::ostringstream out;
791 for (
auto i = m.begin(); i != m.end(); ++i)
793 out << i->first <<
" -> " << i->second << std::endl;
800 sort_expression_substitution_map::const_iterator i = sigmaS.find(s);
801 if (i != sigmaS.end() && i->second != t)
803 throw mcrl2::runtime_error(
"inconsistent abstraction " + data::pp(s) +
" := " + data::pp(t) +
" detected in the abstraction of " + print_symbol(f) +
" (elsewhere it is abstracted as " + data::pp(s) +
" := " + data::pp(i->second) +
").");
820 check_consistency(s1, s2, f1, sigmaS);
830 data::sort_expression_list::iterator i1 = domain1.begin();
831 data::sort_expression_list::iterator i2 = domain2.begin();
833 for (; i1 != domain1.end(); ++i1, ++i2)
835 check_consistency(*i1, *i2, f1, sigmaS);
848 sort_expression_substitution_map sigmaS_consistency = sigmaS;
852 std::set<data::function_symbol> used_function_symbols = pbes_system::find_function_symbols(p);
855 const data::basic_sort_vector& sorts = dataspec.user_defined_sorts();
856 for (
const data::basic_sort& sort: sorts)
858 data::sort_expression s = data::container_sort(data::list_container(), sort);
859 dataspec.add_context_sort(s);
863 for (
const auto& i: sigmaH)
865 data::sort_expression s = data::container_sort(data::list_container(), i.first);
866 dataspec.add_context_sort(s);
867 data::function_symbol_vector list_constructors = dataspec.constructors(s);
868 for (
const data::function_symbol& f1: list_constructors)
870 data::function_symbol f2 = lift_function_symbol_1_2()(f1, sigma);
872 dataspec.add_mapping(f2);
873 mCRL2log(log::debug) <<
"adding list constructor " << f1 <<
" to sigmaF" << std::endl;
877 for (
const data::function_symbol& f1: used_function_symbols)
879 mCRL2log(log::debug) <<
"lifting function symbol: " << f1 << std::endl;
880 if (!has_key(sigmaF, f1))
882 data::function_symbol f2 = lift_function_symbol_1_2()(f1, sigma);
883 mCRL2log(log::debug) <<
"lifted function symbol: " << f1 <<
" to " << f2 << std::endl;
884 check_consistency(f1, f2, sigmaS_consistency);
886 dataspec.add_mapping(f2);
888 data::data_equation eq = lift_equation_1_2()(f1, f2, sigma, sigmaH);
889 mCRL2log(log::debug) <<
"adding equation: " << eq << std::endl;
890 dataspec.add_equation(eq);
894 for (
auto& i : sigmaF)
896 data::function_symbol f2 = i.second;
897 data::function_symbol f3 = lift_function_symbol_2_3()(f2);
899 mCRL2log(log::debug) <<
"adding mapping: " << f3 <<
" " << f3.sort() << std::endl;
900 dataspec.add_mapping(f3);
906 data::data_equation eq = lift_equation_2_3()(f2, f3, sigma);
907 mCRL2log(log::debug) <<
"adding equation: " << eq << std::endl;
908 dataspec.add_equation(eq);
912 void print_fsvec(
const data::function_symbol_vector& v,
const std::string& msg)
const
914 mCRL2log(log::debug) <<
"--- " << msg << std::endl;
915 for (
const data::function_symbol& f: v)
917 mCRL2log(log::debug) << print_symbol(f) << std::endl;
921 void print_fsmap(
const function_symbol_substitution_map& v,
const std::string& msg)
const
923 mCRL2log(log::debug) <<
"--- " << msg << std::endl;
924 for (
const auto& i: v)
926 mCRL2log(log::debug) << print_symbol(i.first) <<
" --> " << print_symbol(i.second) << std::endl;
932 log::logger::set_reporting_level(log::debug);
935 void run(
pbes& p,
const std::string& abstraction_text,
bool is_over_approximation)
938 std::string function_symbol_mapping_text;
939 std::string user_sorts_text;
940 std::string user_equations_text;
941 std::string abstraction_mapping_text;
942 std::string pbes_sorts_text;
944 std::string text = abstraction_text;
945 std::vector<std::string> all_keywords = {
"sort",
"var",
"eqn",
"map",
"cons",
"absfunc",
"absmap" };
946 std::pair<std::string, std::string> q;
948 q = utilities::detail::separate_keyword_section(text,
"sort", all_keywords);
949 user_sorts_text = q.first;
952 q = utilities::detail::separate_keyword_section(text,
"absmap", all_keywords);
954 abstraction_mapping_text = q.first;
958 q = utilities::detail::separate_keyword_section(text,
"absfunc", all_keywords);
959 function_symbol_mapping_text = q.first;
960 user_equations_text = q.second;
963 std::string ptext = data::pp(p.data());
964 q = utilities::detail::separate_keyword_section(ptext,
"sort", all_keywords);
965 pbes_sorts_text = q.first;
968 mCRL2log(log::debug) <<
"--- user sorts ---\n" << user_sorts_text << std::endl;
969 mCRL2log(log::debug) <<
"--- user equations ---\n" << user_equations_text << std::endl;
970 mCRL2log(log::debug) <<
"--- function mapping ---\n" << function_symbol_mapping_text << std::endl;
971 mCRL2log(log::debug) <<
"--- abstraction mapping ---\n" << abstraction_mapping_text << std::endl;
972 mCRL2log(log::debug) <<
"--- pbes sorts ---\n" << pbes_sorts_text << std::endl;
974 if (!abstraction_mapping_text.starts_with(
"absmap"))
976 throw mcrl2::runtime_error(
"the abstraction mapping may not be empty!");
980 data::
data_specification dataspec = data::parse_data_specification(data::pp(p.data()) +
"\n" + user_sorts_text +
"\n" + abstraction_mapping_text.substr(3));
981 mCRL2log(log::debug) <<
"--- data specification 1) ---\n" << dataspec << std::endl;
984 parse_right_hand_sides(function_symbol_mapping_text, dataspec);
985 mCRL2log(log::debug) <<
"--- data specification 2) ---\n" << dataspec << std::endl;
988 dataspec = data::parse_data_specification(data::pp(dataspec) +
"\n" + user_equations_text);
989 mCRL2log(log::debug) <<
"--- data specification 3) ---\n" << dataspec << std::endl;
992 abstraction_map sigmaH = parse_abstraction_map(pbes_sorts_text +
"\n" + user_sorts_text +
"\n" + abstraction_mapping_text.substr(3));
995 sort_expression_substitution_map sigmaS;
996 for (
auto& i: sigmaH)
998 data::function_symbol f = i.second;
999 const data::function_sort& fs = atermpp::down_cast<data::function_sort>(f.sort());
1000 sigmaS[i.first] = fs.codomain();
1002 mCRL2log(log::debug) <<
"\n--- sort expression mapping ---\n" << print_mapping(sigmaS) << std::endl;
1005 function_symbol_substitution_map sigmaF = parse_function_symbol_mapping(function_symbol_mapping_text, dataspec);
1006 mCRL2log(log::debug) <<
"\n--- function symbol mapping ---\n" << print_mapping(sigmaF) << std::endl;
1008 m_generator.add_identifiers(data::function_and_mapping_identifiers(p.data()));
1009 m_generator.add_identifiers(data::function_and_mapping_identifiers(dataspec));
1017 lift_data_specification(p, sigmaH, sigmaS, sigmaF, dataspec);
1018 mCRL2log(log::debug) <<
"--- data specification 4) ---\n" << dataspec << std::endl;
1020 mCRL2log(log::debug) <<
"\n--- function symbol mapping after lifting ---\n" << print_mapping(sigmaF) << std::endl;
1022 mCRL2log(log::debug) <<
"--- pbes before ---\n" << p << std::endl;
1024 p.data() = dataspec;
1027 absinthe_data_expression_builder(sigmaH, sigmaS, sigmaF, m_generator, is_over_approximation).update(p);
1029 mCRL2log(log::debug) <<
"--- pbes after ---\n" << p << std::endl;
data_expression & operator=(const data_expression &) noexcept=default
data_expression & operator=(data_expression &&) noexcept=default
sort_expression sort() const
Returns the sort of the data expression.
const sort_expression & codomain() const
function_sort(const atermpp::aterm &term)
const sort_expression_list & domain() const
function_symbol(const core::identifier_string &name, const sort_expression &sort)
Constructor.
function_symbol()
Default constructor.
const core::identifier_string & name() const
const sort_expression & sort() const
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
sort_expression()
\brief Default constructor X3.
const core::identifier_string & name() const
variable & operator=(variable &&) noexcept=default
variable(const core::identifier_string &name, const sort_expression &sort)
Constructor.
\brief The existential quantification operator for pbes expressions
const data::variable_list & variables() const
static fixpoint_symbol mu()
Returns the mu symbol.
\brief The universal quantification operator for pbes expressions
const data::variable_list & variables() const
propositional_variable & variable()
Returns the pbes variable of the equation.
pbes_expression & formula()
Returns the predicate formula on the right hand side of the equation.
pbes_expression & operator=(const pbes_expression &) noexcept=default
parameterized boolean equation system
propositional_variable_instantiation & initial_state()
Returns the initial state.
\brief A propositional variable instantiation
propositional_variable_instantiation(const core::identifier_string &name, const data::data_expression_list ¶meters)
Constructor.
propositional_variable_instantiation & operator=(propositional_variable_instantiation &&) noexcept=default
\brief A propositional variable declaration
propositional_variable & operator=(propositional_variable &&) noexcept=default
propositional_variable(const core::identifier_string &name, const data::variable_list ¶meters)
\brief Constructor Z12.
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
data_expression create_finite_set(const data_expression &x)
Create the finite set { x }, with x a data expression.
data_expression create_set_comprehension(const variable &x, const data_expression &phi)
Create the set { x | phi }, with phi a predicate that may depend on the variable x.
Namespace for system defined sort fset.
application cons_(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol @fset_cons.
function_symbol empty(const sort_expression &s)
Constructor for function symbol {}.
Namespace for system defined sort set_.
container_sort set_(const sort_expression &s)
Constructor for sort expression Set(S)
const data_expression & true_()
bool is_container_sort(const atermpp::aterm &x)
Returns true if the term t is a container sort.
bool is_function_symbol(const atermpp::aterm &x)
Returns true if the term t is a function symbol.
bool is_basic_sort(const atermpp::aterm &x)
Returns true if the term t is a basic sort.
bool is_function_sort(const atermpp::aterm &x)
Returns true if the term t is a function sort.
bool is_function_update_application(const atermpp::aterm &e)
Recogniser for application of @func_update.
application equal_to(const data_expression &arg0, const data_expression &arg1)
Application of function symbol ==.
bool is_variable(const atermpp::aterm &x)
Returns true if the term t is a variable.
void absinthe_check_expression(const T &x)
data::data_specification & absinthe_data_specification()
void print_used_function_symbols(const pbes &p)
bool is_structured_sort_constructor(const data::data_specification &dataspec, const data::function_symbol &f)
data::sort_expression target_sort(const data::sort_expression &s)
std::string print_term(const Term &x)
std::string print_symbol(const Term &x)
void apply(T &result, const data::data_expression &x)
const sort_expression_substitution_map & sigmaS
bool m_is_over_approximation
void update(pbes_system::pbes &x)
pbes_system::propositional_variable lift(const pbes_system::propositional_variable &x)
data::variable_list lift(const data::variable_list &x)
data::data_expression lift(const data::data_expression &x)
void update(pbes_system::pbes_equation &x)
void apply(T &result, const pbes_system::exists &x)
data::set_identifier_generator & generator
void apply(T &result, const propositional_variable_instantiation &x)
const function_symbol_substitution_map & sigmaF
void apply(T &result, const pbes_system::forall &x)
data::data_expression_list lift(const data::data_expression_list &x)
absinthe_data_expression_builder(const abstraction_map &sigmaA_, const sort_expression_substitution_map &sigmaS_, const function_symbol_substitution_map &sigmaF_, data::set_identifier_generator &generator_, bool is_over_approximation)
const abstraction_map & sigmaH
data::variable_list make_variables(const data::data_expression_list &x, const std::string &hint, sort_function sigma) const
void apply(T &result, const data::data_expression &x)
const abstraction_map & sigmaH
const sort_expression_substitution_map & sigmaS
const function_symbol_substitution_map & sigmaF
void apply(T &result, const data::application &x)
void apply(T &result, const data::function_symbol &x)
void apply(T &result, const data::sort_expression &x)
void apply(T &result, const data::lambda &x)
data::set_identifier_generator & generator
absinthe_sort_expression_builder(const abstraction_map &sigmaA_, const sort_expression_substitution_map &sigmaS_, const function_symbol_substitution_map &sigmaF_, data::set_identifier_generator &generator_)
data::data_equation operator()(const data::function_symbol &f1, const data::function_symbol &f2, sort_function sigma, const abstraction_map &sigmaH) const
lift_equation_1_2()=default
std::vector< data::variable > make_variables(const data::sort_expression_list &sorts, const std::string &hint, sort_function sigma) const
std::vector< data::variable > make_variables(const data::sort_expression_list &sorts, const std::string &hint, sort_function sigma) const
lift_equation_2_3()=default
data::data_expression enumerate_domain(const std::vector< data::variable > &x, const std::vector< data::variable > &X) const
data::data_equation operator()(const data::function_symbol &f2, const data::function_symbol &f3, sort_function sigma) const
std::string print_cleaned(const data::sort_expression &s) const
lift_function_symbol_1_2()
std::set< std::string > suffix_with_sort
std::map< std::string, std::string > unprintable
data::function_symbol operator()(const data::function_symbol &f, sort_function sigma) const
data::function_symbol operator()(const data::function_symbol &f) const
data::data_expression operator()(const data::data_expression &x) const
data::sort_expression operator()(const data::sort_expression &s) const
data::sort_expression operator()(const data::sort_expression &x)
absinthe_sort_expression_builder f
sort_function(const abstraction_map &sigmaH, const sort_expression_substitution_map &sigmaS, const function_symbol_substitution_map &sigmaF, data::set_identifier_generator &generator)
sort_expression_substitution_map parse_sort_expression_mapping(const std::string &text, const data::data_specification &dataspec)
void print_fsvec(const data::function_symbol_vector &v, const std::string &msg) const
void run(pbes &p, const std::string &abstraction_text, bool is_over_approximation)
void parse_right_hand_sides(const std::string &text, data::data_specification &dataspec)
void check_consistency(const data::sort_expression &s, const data::sort_expression &t, const data::function_symbol &f, sort_expression_substitution_map &sigmaS) const
void lift_data_specification(const pbes &p, const abstraction_map &sigmaH, const sort_expression_substitution_map &sigmaS, function_symbol_substitution_map &sigmaF, data::data_specification &dataspec)
function_symbol_substitution_map parse_function_symbol_mapping(const std::string &text, const data::data_specification &dataspec)
data::set_identifier_generator m_generator
void print_fsmap(const function_symbol_substitution_map &v, const std::string &msg) const
void check_consistency(const data::function_symbol &f1, const data::function_symbol &f2, sort_expression_substitution_map &sigmaS) const
abstraction_map parse_abstraction_map(const std::string &text)
std::string print_mapping(const Map &m)