mCRL2
Loading...
Searching...
No Matches
utilities.h
Go to the documentation of this file.
1// Author(s): Thomas Neele, Ruud Koolen
2// Copyright: see the accompanying file COPYING or copy at
3// https://github.com/mCRL2org/mCRL2/blob/master/COPYING
4//
5// Distributed under the Boost Software License, Version 1.0.
6// (See accompanying file LICENSE_1_0.txt or copy at
7// http://www.boost.org/LICENSE_1_0.txt)
8
9#ifndef MCRL2_SMT_UTILITIES_H
10#define MCRL2_SMT_UTILITIES_H
11
12#include <queue>
13
14#include "mcrl2/smt/native_translation.h"
15#include "mcrl2/smt/translation_error.h"
16
17namespace mcrl2
18{
19namespace smt
20{
21
22inline
23std::string translate_identifier(const std::string& id)
24{
25 std::string result = id;
26 for(std::size_t i = 0; i < result.size(); i++)
27 {
28 if(result[i] == '\'')
29 {
30 result[i] = '!';
31 }
32 }
33 return result;
34}
35
36inline
38{
39 return translate_identifier(core::pp(id));
40}
41
42inline
44{
45 auto find_result = nt.symbols.find(f);
46 return find_result != nt.symbols.end() ? find_result->second : translate_identifier(f.name());
47}
48
49inline
50std::string make_projection_name(const data::function_symbol& cons, std::size_t i, const native_translations& nt)
51{
52 // Projections for natively defined sort List
53 if(data::pp(cons) == "|>")
54 {
55 return i == 0 ? "head" : "tail";
56 }
57 // Projection for all constructors that are mapped to @id, such as @cNat and @cInt
58 if(translate_symbol(cons, nt) == "@id")
59 {
60 return "@id";
61 }
62 return "@proj-" + translate_symbol(cons, nt) + "-" + std::to_string(i);
63}
64
65inline
67{
68 data::function_sort sort(data::sort_expression_list({ cons.sort().target_sort() }), arg_sort);
69 return data::function_symbol(make_projection_name(cons, i, nt), sort);
70}
71
72inline
74{
75 auto find_result = nt.special_recogniser.find(cons);
76 if(find_result != nt.special_recogniser.end())
77 {
78 return find_result->second;
79 }
80 // Z3 automatically generates recognisers "is-constructorname"
81 return "is-" + translate_symbol(cons, nt);
82}
83
84inline
86{
87 data::function_sort sort(data::sort_expression_list({ cons.sort().target_sort() }), data::sort_bool::bool_());
88 return data::function_symbol(make_recogniser_name(cons, nt), sort);
89}
90
91template<class T>
93{
94 std::queue<T> vertices_without_dependencies;
95 std::map<T, std::set<T> > reverse_dependencies;
96 for (const auto& p: dependencies)
97 {
98 const T& node = p.first;
99 const std::set<T>& successors = p.second;
100 for (const T& succ: successors)
101 {
102 reverse_dependencies[succ].insert(node);
103 }
104
105 if (successors.empty())
106 {
107 vertices_without_dependencies.push(node);
108 }
109 }
110
111 std::vector<T> output;
112 output.reserve(dependencies.size());
113
114 while (!vertices_without_dependencies.empty())
115 {
116 T vertex = vertices_without_dependencies.front();
117 vertices_without_dependencies.pop();
118 output.push_back(vertex);
119
120 const std::set<T>& successors = reverse_dependencies[vertex];
121 for (const T& succ: successors)
122 {
123 dependencies[succ].erase(vertex);
124 if (dependencies[succ].empty())
125 {
126 vertices_without_dependencies.push(succ);
127 }
128 }
129 }
130
131 if (output.size() != dependencies.size())
132 {
133 for (const T& node: output)
134 {
135 dependencies.erase(node);
136 }
137 assert(!dependencies.empty());
138 //TODO: SMT2.5 format supports mutually recursive data types
139 std::ostringstream out;
140 for(const auto& p: dependencies)
141 {
142 out << p.first << ", ";
143 }
144 throw translation_error("Dependency loop trying to resolve dependencies: {" + out.str() + "}");
145 }
146 else
147 {
148 return output;
149 }
150}
151
152template <typename OutStream>
154{
155protected:
157 std::ostringstream buf;
158 OutStream& m_out;
159
160public:
161 stack_outstream(OutStream& out)
162 : m_out(out)
163 {}
164
166 {
167 m_out << buf.str();
168 }
169
170 void push()
171 {
172 m_stack.push(buf.tellp());
173 }
174
175 void pop()
176 {
177 m_stack.pop();
178 }
179
180 typename OutStream::pos_type top_size()
181 {
182 assert(!m_stack.empty());
183 return buf.tellp() - m_stack.top();
184 }
185
186 void copy_top(std::string& dest)
187 {
188 dest = buf.str().substr(m_stack.top(), std::string::npos);
189 }
190
191 template <typename T>
192 stack_outstream& operator<<(const T& s)
193 {
194 buf << s;
195 return *this;
196 }
197};
198
199} // namespace smt
200} // namespace mcrl2
201
202#endif
bool operator==(const unprotected_aterm_core &t) const
Comparison operator.
Definition aterm_core.h:83
const variable_list & variables() const
Definition abstraction.h:63
const data_expression & body() const
Definition abstraction.h:68
\brief A sort alias
Definition alias.h:26
\brief A basic sort
Definition basic_sort.h:26
\brief A container sort
const container_type & container_name() const
\brief A data equation
const data_expression & lhs() const
const data_expression & condition() const
const data_expression & rhs() const
const variable_list & variables() const
data_expression & operator=(data_expression &&) noexcept=default
sort_expression sort() const
Returns the sort of the data expression.
Definition data.cpp:108
application operator()(const data_expression &e) const
Apply a data expression to a data expression.
existential quantification.
Definition exists.h:26
universal quantification.
Definition forall.h:26
\brief A function sort
function_sort(const sort_expression_list &domain, const sort_expression &codomain)
\brief Constructor Z14.
\brief A function symbol
const sort_expression & sort() const
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
\brief A sort expression
const sort_expression & target_sort() const
Returns the target sort of this expression.
\brief A data variable
Definition variable.h:28
const sort_expression & sort() const
Definition variable.h:43
\brief A where expression
const data_expression & body() const
answer solve(const data::variable_list &vars, const data::data_expression &expr, const std::chrono::microseconds &timeout=std::chrono::microseconds::zero())
Definition solver.cpp:54
answer execute_and_check(const std::string &command, const std::chrono::microseconds &timeout) const
Definition solver.cpp:21
smt_solver(const data::data_specification &dataspec)
Definition solver.cpp:45
OutStream::pos_type top_size()
Definition utilities.h:180
std::ostringstream buf
Definition utilities.h:157
std::stack< typename OutStream::pos_type > m_stack
Definition utilities.h:156
stack_outstream(OutStream &out)
Definition utilities.h:161
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
Definition logger.h:391
The main namespace for the aterm++ library.
Definition algorithm.h:21
atermpp::aterm_string identifier_string
String type of the LPS library. Identifier strings are represented internally as ATerms.
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.
data_expression and_(data_expression const &p, data_expression const &q)
Returns an expression equivalent to p or q.
Namespace for system defined sort bool_.
Definition bool.h:32
const basic_sort & bool_()
Constructor for sort expression Bool.
Definition bool.h:44
const function_symbol & implies()
Constructor for function symbol =>.
Definition bool.h:363
const function_symbol & and_()
Constructor for function symbol &&.
Definition bool.h:235
const function_symbol & false_()
Constructor for function symbol false.
Definition bool.h:109
const function_symbol & or_()
Constructor for function symbol ||.
Definition bool.h:299
const function_symbol & not_()
Constructor for function symbol !.
Definition bool.h:173
const function_symbol & true_()
Constructor for function symbol true.
Definition bool.h:77
Namespace for system defined sort int_.
const function_symbol & pos2int()
Constructor for function symbol Pos2Int.
Definition int1.h:360
const function_symbol & int2nat()
Constructor for function symbol Int2Nat.
Definition int1.h:298
const function_symbol & nat2int()
Constructor for function symbol Nat2Int.
Definition int1.h:236
const function_symbol & cneg()
Constructor for function symbol @cNeg.
Definition int1.h:142
const function_symbol & int2pos()
Constructor for function symbol Int2Pos.
Definition int1.h:422
const function_symbol & cint()
Constructor for function symbol @cInt.
Definition int1.h:80
const basic_sort & int_()
Constructor for sort expression Int.
Definition int1.h:47
Namespace for system defined sort nat.
const function_symbol & c0()
Constructor for function symbol @c0.
Definition nat1.h:108
const function_symbol & cnat()
Constructor for function symbol @cNat.
Definition nat1.h:140
const basic_sort & nat()
Constructor for sort expression Nat.
Definition nat1.h:46
const function_symbol & nat2pos()
Constructor for function symbol Nat2Pos.
Definition nat1.h:362
const function_symbol & pos2nat()
Constructor for function symbol Pos2Nat.
Definition nat1.h:300
Namespace for system defined sort pos.
const function_symbol & c1()
Constructor for function symbol @c1.
Definition pos1.h:78
const function_symbol & cdub()
Constructor for function symbol @cDub.
Definition pos1.h:110
const basic_sort & pos()
Constructor for sort expression Pos.
Definition pos1.h:45
Namespace for system defined sort real_.
const function_symbol & creal()
Constructor for function symbol @cReal.
Definition real1.h:107
const function_symbol & pos2real()
Constructor for function symbol Pos2Real.
Definition real1.h:171
const function_symbol & real2nat()
Constructor for function symbol Real2Nat.
Definition real1.h:419
const function_symbol & real2int()
Constructor for function symbol Real2Int.
Definition real1.h:481
const basic_sort & real_()
Constructor for sort expression Real.
Definition real1.h:48
const function_symbol & nat2real()
Constructor for function symbol Nat2Real.
Definition real1.h:233
const function_symbol & int2real()
Constructor for function symbol Int2Real.
Definition real1.h:295
const function_symbol & real2pos()
Constructor for function symbol Real2Pos.
Definition real1.h:357
Namespace for all data library functionality.
Definition data.cpp:22
bool is_application(const data_expression &t)
Returns true if the term t is an application.
atermpp::term_list< sort_expression > sort_expression_list
\brief list of sort_expressions
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
application greater_equal(const data_expression &arg0, const data_expression &arg1)
Application of function symbol >=.
Definition standard.h:369
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 ==.
Definition standard.h:126
application equal_to(const data_expression &arg0, const data_expression &arg1)
Application of function symbol ==.
Definition standard.h:144
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)
static const std::map< data::structured_sort, std::string > & empty_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
Definition solver.cpp:91
void translate_equation(const data::data_equation &eq, OutputStream &out, std::unordered_map< data::data_expression, std::string > &c, const native_translations &nt)
std::string translate_symbol_disambiguate(const data::function_symbol &f, const native_translations &nt)
data::data_expression declare_variables_binder(const data::variable_list &vars, OutputStream &out, const native_translations &nt)
Declare variables to be used in binder such as exists or forall and print the declaration to out.
static const native_translation_t pp_translation
Definition solver.cpp:85
bool is_higher_order(const data::application &a)
bool is_higher_order(const data::function_symbol &f)
translate_sort_expression_traverser< Traverser, OutputStream > make_translate_sort_expression_traverser(OutputStream &out, const native_translations &nt, const std::map< data::structured_sort, std::string > &snm)
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
Definition solver.cpp:99
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)
void translate_sort_expression(const T &x, OutputStream &o, const native_translations &nt, const std::map< data::structured_sort, std::string > &snm=detail::empty_name_map())
std::string make_projection_name(const data::function_symbol &cons, std::size_t i, const native_translations &nt)
Definition utilities.h:50
void translate_assertion(const T &x, OutputStream &o, std::unordered_map< data::data_expression, std::string > &c, const native_translations &nt)
native_translations initialise_native_translation(const data::data_specification &dataspec)
Definition solver.cpp:126
data::function_symbol make_recogniser_func(const data::function_symbol &cons, const native_translations &nt)
Definition utilities.h:85
data::function_symbol make_projection_func(const data::function_symbol &cons, const data::sort_expression &arg_sort, std::size_t i, const native_translations &nt)
Definition utilities.h:66
std::string make_recogniser_name(const data::function_symbol &cons, const native_translations &nt)
Definition utilities.h:73
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)
void translate_variable_declaration(const Container &vars, OutputStream &o, std::unordered_map< data::data_expression, std::string > &c, const native_translations &nt)
void translate_data_expression(const T &x, OutputStream &o, std::unordered_map< data::data_expression, std::string > &c, const native_translations &nt)
std::string translate_symbol(const data::function_symbol &f, const native_translations &nt)
Definition utilities.h:43
std::vector< T > topological_sort(std::map< T, std::set< T > > dependencies)
Definition utilities.h:92
std::string translate_identifier(const core::identifier_string &id)
Definition utilities.h:37
std::function< void(data::data_expression, std::function< void(std::string)>, std::function< void(data::data_expression)>)> native_translation_t
@ UNKNOWN
Definition answer.h:24
fixed_string_translation(const std::string &s)
Definition solver.cpp:73
void operator()(const data::data_expression &, const std::function< void(std::string)> &output_func, const std::function< void(data::data_expression)> &) const
Definition solver.cpp:77
Traverser< translate_data_expression_traverser< Traverser, OutputStream > > super
translate_data_expression_traverser(OutputStream &out_, std::unordered_map< data::data_expression, std::string > &cache, const native_translations &nt)
std::unordered_map< data::data_expression, std::string > & m_cache
const std::map< data::structured_sort, std::string > & m_struct_names
translate_sort_expression_traverser(OutputStream &out_, const native_translations &nt, const std::map< data::structured_sort, std::string > &snm)
Traverser< translate_sort_expression_traverser< Traverser, OutputStream > > super
bool is_ambiguous(const data::function_symbol &f) 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