9#ifndef MCRL2_SMT_TRANSLATE_SPECIFICATION_H
10#define MCRL2_SMT_TRANSLATE_SPECIFICATION_H
12#include "mcrl2/atermpp/aterm_io.h"
13#include "mcrl2/core/detail/print_utility.h"
14#include "mcrl2/data/find.h"
15#include "mcrl2/smt/translate_expression.h"
24template <
typename OutputStream>
31 std::map<data::structured_sort, std::string>& struct_name_map)
33 auto find_result = nt.sorts.find(s);
34 if(find_result != nt.sorts.end())
40 out <<
"(declare-datatypes () ((" << translate_identifier(sort_name) <<
" ";
41 for(
const data::function_symbol& cons: dataspec.constructors(s))
43 out <<
"(" << translate_identifier(cons.name()) <<
" ";
44 if(data::is_function_sort(cons.sort()))
46 const data::function_sort& cs = atermpp::down_cast<data::function_sort>(cons.sort());
47 std::size_t index = 0;
48 for(
const data::sort_expression& arg: cs.domain())
50 out <<
"(" << make_projection_name(cons, index, nt) <<
" ";
51 translate_sort_expression(arg, out, nt, struct_name_map);
61template <
typename OutputStream>
67 std::map<data::structured_sort, std::string>& struct_name_map)
69 translate_sort_definition(pp(s.name()), s, dataspec, out, nt, struct_name_map);
76 std::set<data::sort_expression> dependencies;
77 for(
const data::function_symbol& cons: dataspec.constructors(sort))
79 find_sort_expressions(cons, std::inserter(dependencies, dependencies.end()));
82 std::set<data::sort_expression> result;
83 for(
const data::sort_expression& s: dependencies)
85 if((data::is_basic_sort(s) || data::is_structured_sort(s)) && s != sort)
98 std::map<data::sort_expression, std::set<data::sort_expression>> result;
99 for(
const data::sort_expression& s: dataspec.sorts())
101 if(data::is_function_sort(s))
107 auto find_alias = dataspec.sort_alias_map().find(s);
108 if(find_alias != dataspec.sort_alias_map().end() && find_alias->second != s)
110 if(data::is_structured_sort(s))
112 struct_name_map[atermpp::down_cast<data::structured_sort>(s)] = pp(find_alias->second);
118 result[s] = find_dependencies(dataspec, s);
123template <
typename OutputStream>
129 std::map<data::structured_sort, std::string>& struct_name_map)
131 auto sort_dependencies = find_sorts_and_dependencies(dataspec, struct_name_map);
136 auto sorts = topological_sort(sort_dependencies);
137 for(
const data::sort_expression& s: sorts)
139 std::string name(pp(s));
140 if(data::is_structured_sort(s))
144 name = pp(id_gen(
"@struct"));
145 struct_name_map[atermpp::down_cast<data::structured_sort>(s)] = name;
147 translate_sort_definition(name, s, dataspec, out, nt, struct_name_map);
153template <
typename OutputStream>
157 const std::map<data::structured_sort, std::string>& struct_name_map)
159 out <<
"(define-sort " << translate_identifier(s.name().name()) <<
" () ";
160 translate_sort_expression(s.reference(), out, nt, struct_name_map);
171 for(
const data::sort_expression& arg: fs.domain())
173 if(data::is_function_sort(arg))
188 return is_higher_order(f);
211template <
typename OutputStream>
214 const std::map<data::structured_sort, std::string>& snm,
bool check_native =
true)
221 out <<
"(declare-fun " << translate_symbol(f, nt) <<
" ";
226 for(
const data::sort_expression& s: fs.domain())
228 translate_sort_expression(s, out, nt, snm);
232 translate_sort_expression(fs.codomain(), out, nt, snm);
237 translate_sort_expression(f.sort(), out, nt, snm);
242template <
typename OutputStream>
245 std::unordered_map<data::data_expression, std::string>& c,
247 const std::map<data::structured_sort, std::string>& snm)
249 out <<
"(define-funs-rec (\n";
250 for(
const auto& [mapping, eqn]: nt.mappings)
252 if(is_higher_order(mapping))
256 mCRL2log(log::verbose) <<
"Outputting " << mapping <<
": " << mapping.sort() <<
" with eqn " << eqn << std::endl;
258 out <<
"(" << translate_symbol(mapping, nt) <<
" ";
259 data::data_expression condition = declare_variables_binder(eqn.variables(), out, nt);
261 translate_sort_expression(mapping.sort().target_sort(), out, nt, snm);
267 for(
const auto& [mapping, eqn]: nt.mappings)
269 if(is_higher_order(mapping))
274 translate_data_expression(eqn.rhs(), out, c, nt);
280template <
typename OutputStream>
284 std::unordered_map<data::data_expression, std::string>& c,
296 translate_assertion(definition, out, c, nt);
301template <
typename OutputStream>
304 std::unordered_map<data::data_expression, std::string>& c,
310 std::map<data::structured_sort, std::string> struct_name_map;
313 detail::translate_sort_definitions(dataspec, o, nt, id_gen, struct_name_map);
314 for(
const auto& s: dataspec.sort_alias_map())
316 if(data::is_basic_sort(s.first))
318 detail::translate_alias(data::alias(atermpp::down_cast<data::basic_sort>(s.first), s.second), o, nt, struct_name_map);
323 for(
const data::function_symbol& f: dataspec.mappings())
325 detail::translate_mapping(f, o, nt, struct_name_map);
327 detail::translate_native_mappings(o, c, nt, struct_name_map);
330 for(
const data::data_equation& eq: dataspec.equations())
332 detail::translate_equation(eq, o, c, nt);
const data_expression & lhs() const
const data_expression & condition() const
const data_expression & rhs() const
const variable_list & variables() const
sort_expression sort() const
Returns the sort of the data expression.
application operator()(const data_expression &e) const
Apply a data expression to a data expression.
const sort_expression & sort() const
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
answer solve(const data::variable_list &vars, const data::data_expression &expr, const std::chrono::microseconds &timeout=std::chrono::microseconds::zero())
answer execute_and_check(const std::string &command, const std::chrono::microseconds &timeout) const
smt_solver(const data::data_specification &dataspec)
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
The main namespace for the aterm++ library.
A collection of utilities for lazy expression construction.
data_expression implies(data_expression const &p, data_expression const &q)
Returns an expression equivalent to p implies q.
Namespace for system defined sort bool_.
const basic_sort & bool_()
Constructor for sort expression Bool.
const function_symbol & implies()
Constructor for function symbol =>.
const function_symbol & and_()
Constructor for function symbol &&.
const function_symbol & false_()
Constructor for function symbol false.
const function_symbol & or_()
Constructor for function symbol ||.
const function_symbol & not_()
Constructor for function symbol !.
const function_symbol & true_()
Constructor for function symbol true.
Namespace for system defined sort int_.
const function_symbol & pos2int()
Constructor for function symbol Pos2Int.
const function_symbol & int2nat()
Constructor for function symbol Int2Nat.
const function_symbol & nat2int()
Constructor for function symbol Nat2Int.
const function_symbol & cneg()
Constructor for function symbol @cNeg.
const function_symbol & int2pos()
Constructor for function symbol Int2Pos.
const function_symbol & cint()
Constructor for function symbol @cInt.
const basic_sort & int_()
Constructor for sort expression Int.
Namespace for system defined sort nat.
const function_symbol & c0()
Constructor for function symbol @c0.
const function_symbol & cnat()
Constructor for function symbol @cNat.
const basic_sort & nat()
Constructor for sort expression Nat.
const function_symbol & nat2pos()
Constructor for function symbol Nat2Pos.
const function_symbol & pos2nat()
Constructor for function symbol Pos2Nat.
Namespace for system defined sort pos.
const function_symbol & c1()
Constructor for function symbol @c1.
const function_symbol & cdub()
Constructor for function symbol @cDub.
const basic_sort & pos()
Constructor for sort expression Pos.
Namespace for system defined sort real_.
const function_symbol & creal()
Constructor for function symbol @cReal.
const function_symbol & pos2real()
Constructor for function symbol Pos2Real.
const function_symbol & real2nat()
Constructor for function symbol Real2Nat.
const function_symbol & real2int()
Constructor for function symbol Real2Int.
const basic_sort & real_()
Constructor for sort expression Real.
const function_symbol & nat2real()
Constructor for function symbol Nat2Real.
const function_symbol & int2real()
Constructor for function symbol Int2Real.
const function_symbol & real2pos()
Constructor for function symbol Real2Pos.
Namespace for all data library functionality.
bool is_application(const data_expression &t)
Returns true if the term t is an application.
bool is_function_symbol(const atermpp::aterm &x)
Returns true if the term t is a function symbol.
atermpp::term_list< variable > variable_list
\brief list of variables
bool is_function_sort(const atermpp::aterm &x)
Returns true if the term t is a function sort.
function_symbol equal_to(const sort_expression &s)
Constructor for function symbol ==.
application equal_to(const data_expression &arg0, const data_expression &arg1)
Application of function symbol ==.
void translate_sort_definitions(const data::data_specification &dataspec, OutputStream &out, const native_translations &nt, data::set_identifier_generator &id_gen, std::map< data::structured_sort, std::string > &struct_name_map)
void translate_sort_definition(const std::string &sort_name, const data::sort_expression &s, const data::data_specification &dataspec, OutputStream &out, const native_translations &nt, std::map< data::structured_sort, std::string > &struct_name_map)
void translate_mapping(const data::function_symbol &f, OutputStream &out, const native_translations &nt, const std::map< data::structured_sort, std::string > &snm, bool check_native=true)
static const native_translation_t pp_real_translation
void translate_equation(const data::data_equation &eq, OutputStream &out, std::unordered_map< data::data_expression, std::string > &c, const native_translations &nt)
static const native_translation_t pp_translation
bool is_higher_order(const data::application &a)
bool is_higher_order(const data::function_symbol &f)
std::map< data::sort_expression, std::set< data::sort_expression > > find_sorts_and_dependencies(const data::data_specification &dataspec, std::map< data::structured_sort, std::string > &struct_name_map)
void translate_alias(const data::alias &s, OutputStream &out, const native_translations &nt, const std::map< data::structured_sort, std::string > &struct_name_map)
void translate_sort_definition(const data::basic_sort &s, const data::data_specification &dataspec, OutputStream &out, const native_translations &nt, std::map< data::structured_sort, std::string > &struct_name_map)
static const native_translation_t reconstruct_divmod
static std::set< data::sort_expression > find_dependencies(const data::data_specification &dataspec, const data::sort_expression &sort)
bool is_higher_order(const data::data_equation &eq)
void translate_native_mappings(OutputStream &out, std::unordered_map< data::data_expression, std::string > &c, const native_translations &nt, const std::map< data::structured_sort, std::string > &snm)
native_translations initialise_native_translation(const data::data_specification &dataspec)
void translate_data_specification(const data::data_specification &dataspec, OutputStream &o, std::unordered_map< data::data_expression, std::string > &c, const native_translations &nt)
void unfold_pattern_matching(const data::data_specification &dataspec, native_translations &nt)
std::function< void(data::data_expression, std::function< void(std::string)>, std::function< void(data::data_expression)>)> native_translation_t
fixed_string_translation(const std::string &s)
void operator()(const data::data_expression &, const std::function< void(std::string)> &output_func, const std::function< void(data::data_expression)> &) const
void set_native_definition(const data::function_symbol &f)
Record that the mapping and equations for f should not be translated.
bool has_native_definition(const data::function_symbol &f) const
bool has_native_definition(const data::data_equation &eq) const
std::size_t operator()(const atermpp::detail::reference_aterm< T > &t) const