mCRL2
Loading...
Searching...
No Matches
pres.h
Go to the documentation of this file.
1// Author(s): Jan Friso Groote. Based on pbes.h made by Wieger Wesselink
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//
11
12#ifndef MCRL2_PRES_PRES_H
13#define MCRL2_PRES_PRES_H
14
15#include <algorithm>
18
19namespace mcrl2
20{
21
23namespace pres_system
24{
25
26class pres;
28
29// template function overloads
30std::string pp(const pres& x);
31void normalize_sorts(pres& x, const data::sort_specification& sortspec);
32void translate_user_notation(pres_system::pres& x);
33std::set<data::sort_expression> find_sort_expressions(const pres_system::pres& x);
34std::set<data::variable> find_all_variables(const pres_system::pres& x);
35std::set<data::variable> find_free_variables(const pres_system::pres& x);
36std::set<data::function_symbol> find_function_symbols(const pres_system::pres& x);
37
38bool is_well_typed_equation(const pres_equation& eqn,
39 const std::set<data::sort_expression>& declared_sorts,
40 const std::set<data::variable>& declared_global_variables,
41 const data::data_specification& data_spec
42 );
43
44bool is_well_typed_pres(const std::set<data::sort_expression>& declared_sorts,
45 const std::set<data::variable>& declared_global_variables,
46 const std::set<data::variable>& occurring_global_variables,
47 const std::set<propositional_variable>& declared_variables,
48 const std::set<propositional_variable_instantiation>& occ,
49 const propositional_variable_instantiation& init,
50 const data::data_specification& data_spec
51 );
52
53atermpp::aterm pres_to_aterm(const pres& p);
54
56// <PRES> ::= PRES(<DataSpec>, <GlobVarSpec>, <PREqnSpec>, <PRInit>)
57// <PREqnSpec> ::= PREqnSpec(<PREqn>*)
58class pres
59{
60 public:
62
63 protected:
66
68 std::vector<pres_equation> m_equations;
69
71 std::set<data::variable> m_global_variables;
72
75
78 std::set<propositional_variable> compute_declared_variables() const
79 {
80 std::set<propositional_variable> result;
81 for (const pres_equation& eqn: equations())
82 {
83 result.insert(eqn.variable());
84 }
85 return result;
86 }
87
96 template <typename Iter>
97 bool is_declared_in(Iter first, Iter last, const propositional_variable_instantiation& v, const data::data_specification& data_spec) const
98 {
99 for (Iter i = first; i != last; ++i)
100 {
101 if (i->name() == v.name() && data::detail::equal_sorts(i->parameters(), v.parameters(), data_spec))
102 {
103 return true;
104 }
105 }
106 return false;
107 }
108
109 public:
111 pres() = default;
112
118 const std::vector<pres_equation>& equations,
120 :
121 m_data(data),
124 {
128 assert(is_well_typed());
129 }
130
137 const std::set<data::variable>& global_variables,
138 const std::vector<pres_equation>& equations,
140 :
141 m_data(data),
145 {
148 assert(is_well_typed());
149 }
150
154 {
155 return m_data;
156 }
157
160 {
161 m_data=d;
162 if (std::find(m_data.context_sorts().begin(), m_data.context_sorts().end(),data::sort_real::real_())==m_data.context_sorts().end())
163 {
165 }
166 }
167
170 const std::vector<pres_equation>& equations() const
171 {
172 return m_equations;
173 }
174
177 std::vector<pres_equation>& equations()
178 {
179 return m_equations;
180 }
181
184 const std::set<data::variable>& global_variables() const
185 {
186 return m_global_variables;
187 }
188
191 std::set<data::variable>& global_variables()
192 {
193 return m_global_variables;
194 }
195
199 {
200 return m_initial_state;
201 }
202
206 {
207 return m_initial_state;
208 }
209
213 std::set<propositional_variable> binding_variables() const
214 {
215 using namespace std::rel_ops; // for definition of operator!= in terms of operator==
216
217 std::set<propositional_variable> result;
218 for (const pres_equation& eqn: equations())
219 {
220 result.insert(eqn.variable());
221 }
222 return result;
223 }
224
228 std::set<propositional_variable_instantiation> occurring_variable_instantiations() const;
229
233 std::set<propositional_variable> occurring_variables() const
234 {
235 std::set<propositional_variable> result;
236 std::set<propositional_variable_instantiation> occ = occurring_variable_instantiations();
237 std::map<core::identifier_string, propositional_variable> declared_variables;
238 for (const pres_equation& eqn: equations())
239 {
240 declared_variables[eqn.variable().name()] = eqn.variable();
241 }
242 for (const propositional_variable_instantiation& v: occ)
243 {
244 result.insert(declared_variables[v.name()]);
245 }
246 return result;
247 }
248
251 bool is_closed() const
252 {
253 std::set<propositional_variable> bnd = binding_variables();
254 std::set<propositional_variable> occ = occurring_variables();
255 return std::includes(bnd.begin(), bnd.end(), occ.begin(), occ.end()) && is_declared_in(bnd.begin(), bnd.end(), initial_state(), data());
256 }
257
273 bool is_well_typed() const
274 {
275 std::set<data::sort_expression> declared_sorts = data::detail::make_set(data().sorts());
276 const std::set<data::variable>& declared_global_variables = global_variables();
277 std::set<data::variable> occurring_global_variables = pres_system::find_free_variables(*this);
278 std::set<propositional_variable> declared_variables = compute_declared_variables();
279 std::set<propositional_variable_instantiation> occ = occurring_variable_instantiations();
280
281 // check 1), 4), 5), 6), 8) and 9)
282 if (!is_well_typed_pres(declared_sorts, declared_global_variables, occurring_global_variables, declared_variables, occ, initial_state(), data()))
283 {
284 return false;
285 }
286
287 // check 2), 3) and 7)
288 for (const pres_equation& eqn: equations())
289 {
290 if (!is_well_typed_equation(eqn, declared_sorts, declared_global_variables, data()))
291 {
292 return false;
293 }
294 }
295
296 // check 10)
297 return data().is_well_typed();
298 }
299};
300
301//--- start generated class pres ---//
302// prototype declaration
303std::string pp(const pres& x);
304
309inline
310std::ostream& operator<<(std::ostream& out, const pres& x)
311{
312 return out << pres_system::pp(x);
313}
314//--- end generated class pres ---//
315
316
319inline
321{
322 std::set<data::sort_expression> s = pres_system::find_sort_expressions(p);
325 p.set_data(d);
326}
327
331// TODO: improve the comparison
332inline
333bool operator==(const pres& p1, const pres& p2)
334{
335 return pres_to_aterm(p1) == pres_to_aterm(p2);
336}
337
338} // namespace pres_system
339
340} // namespace mcrl2
341
342#endif // MCRL2_PRES_PRES_H
bool is_well_typed() const
Returns true if.
const std::set< sort_expression > & context_sorts() const
Return the user defined context sorts of the current specification.
void add_context_sorts(const Container &c, typename atermpp::enable_if_container< Container >::type *=nullptr)
Adds the sorts in c to the context sorts.
void add_context_sort(const sort_expression &s)
Adds the sort s to the context sorts.
parameterized boolean equation system
Definition pres.h:59
propositional_variable_instantiation & initial_state()
Returns the initial state.
Definition pres.h:205
pres(data::data_specification const &data, const std::set< data::variable > &global_variables, const std::vector< pres_equation > &equations, propositional_variable_instantiation initial_state)
Constructor.
Definition pres.h:136
const data::data_specification & data() const
Returns the data specification.
Definition pres.h:153
const std::set< data::variable > & global_variables() const
Returns the declared free variables of the pres.
Definition pres.h:184
data::data_specification m_data
The data specification.
Definition pres.h:65
pres(data::data_specification const &data, const std::vector< pres_equation > &equations, propositional_variable_instantiation initial_state)
Constructor.
Definition pres.h:117
bool is_declared_in(Iter first, Iter last, const propositional_variable_instantiation &v, const data::data_specification &data_spec) const
Checks if the propositional variable instantiation v appears with the right type in the sequence of p...
Definition pres.h:97
void set_data(const data::data_specification &d)
Allows to set the data specification of a pres.
Definition pres.h:159
const propositional_variable_instantiation & initial_state() const
Returns the initial state.
Definition pres.h:198
pres_equation equation_type
Definition pres.h:61
std::set< propositional_variable > compute_declared_variables() const
Returns the predicate variables appearing in the left hand side of an equation.
Definition pres.h:78
std::set< propositional_variable > occurring_variables() const
Returns the set of occurring propositional variable declarations of the pres, i.e....
Definition pres.h:233
std::set< data::variable > m_global_variables
The set of global variables.
Definition pres.h:71
std::set< propositional_variable > binding_variables() const
Returns the set of binding variables of the pres. This is the set variables that occur on the left ha...
Definition pres.h:213
propositional_variable_instantiation m_initial_state
The initial state.
Definition pres.h:74
const std::vector< pres_equation > & equations() const
Returns the equations.
Definition pres.h:170
pres()=default
Constructor.
std::vector< pres_equation > & equations()
Returns the equations.
Definition pres.h:177
bool is_well_typed() const
Checks if the PRES is well typed.
Definition pres.h:273
std::set< propositional_variable_instantiation > occurring_variable_instantiations() const
Returns the set of occurring propositional variable instantiations of the pres. This is the set of va...
Definition pres.cpp:111
std::set< data::variable > & global_variables()
Returns the declared free variables of the pres.
Definition pres.h:191
std::vector< pres_equation > m_equations
The sequence of pres equations.
Definition pres.h:68
bool is_closed() const
True if the pres is closed.
Definition pres.h:251
\brief A propositional variable instantiation
const data::data_expression_list & parameters() const
add your file description here.
MCRL2_EXPORT bool init(rewriter_interface *i, RewriterCompilingJitty *this_rewriter)
bool check_rule_PRES(const Term &t)
bool equal_sorts(const data::variable_list &v, const data::data_expression_list &w, const data::data_specification &data_spec)
Checks if the sorts of the variables/expressions in both lists are equal.
Definition equal_sorts.h:28
std::set< typename Container::value_type > make_set(const Container &c)
Makes a set of the given container.
const basic_sort & real_()
Constructor for sort expression Real.
Definition real1.h:48
void translate_user_notation(pres_system::pres &x)
Definition pres.cpp:53
bool operator==(const pres &p1, const pres &p2)
Equality operator on PRESs.
Definition pres.h:333
void find_free_variables(const T &x, OutputIterator o)
Definition find.h:87
bool is_well_typed_equation(const pres_equation &eqn, const std::set< data::sort_expression > &declared_sorts, const std::set< data::variable > &declared_global_variables, const data::data_specification &data_spec)
Definition pres.cpp:85
void find_sort_expressions(const T &x, OutputIterator o)
Definition find.h:152
void find_all_variables(const T &x, OutputIterator o)
Definition find.h:66
std::string pp(const pres &x)
Definition pres.cpp:45
bool is_well_typed_pres(const std::set< data::sort_expression > &declared_sorts, const std::set< data::variable > &declared_global_variables, const std::set< data::variable > &occurring_global_variables, const std::set< propositional_variable > &declared_variables, const std::set< propositional_variable_instantiation > &occ, const propositional_variable_instantiation &init, const data::data_specification &data_spec)
Definition pres.cpp:94
void normalize_sorts(T &x, const data::sort_specification &sortspec, typename std::enable_if< !std::is_base_of< atermpp::aterm, T >::value >::type *=nullptr)
void find_function_symbols(const T &x, OutputIterator o)
Definition find.h:173
atermpp::aterm pres_to_aterm(const pres &p)
Conversion to atermappl.
Definition io.cpp:319
void complete_data_specification(pres &)
Adds all sorts that appear in the PRES p to the data specification of p.
Definition pres.h:320
atermpp::aterm_ostream & operator<<(atermpp::aterm_ostream &stream, const pres &pres)
Writes the pres to a stream.
Definition io.cpp:225
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
Definition indexed_set.h:72
The class pres_equation.