mCRL2
Loading...
Searching...
No Matches
pbes.h
Go to the documentation of this file.
1// Author(s): 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//
9/// \file mcrl2/pbes/pbes.h
10/// \brief The class pbes.
11
12#ifndef MCRL2_PBES_PBES_H
13#define MCRL2_PBES_PBES_H
14
15#include "mcrl2/data/detail/equal_sorts.h"
16#include "mcrl2/pbes/pbes_equation.h"
17
18/// \brief The main namespace for the PBES library.
19namespace mcrl2::pbes_system
20{
21
22class pbes;
24
25// template function overloads
26void normalize_sorts(pbes& x, const data::sort_specification& sortspec);
32
34 const std::set<data::sort_expression>& declared_sorts,
35 const std::set<data::variable>& declared_global_variables,
36 const data::data_specification& data_spec
37 );
38
39bool is_well_typed_pbes(const std::set<data::sort_expression>& declared_sorts,
40 const std::set<data::variable>& declared_global_variables,
41 const std::set<data::variable>& occurring_global_variables,
42 const std::set<propositional_variable>& declared_variables,
43 const std::set<propositional_variable_instantiation>& occ,
45 const data::data_specification& data_spec
46 );
47
49
50/// \brief parameterized boolean equation system
51// <PBES> ::= PBES(<DataSpec>, <GlobVarSpec>, <PBEqnSpec>, <PBInit>)
52// <PBEqnSpec> ::= PBEqnSpec(<PBEqn>*)
53class pbes
54{
55 public:
56 using equation_type = pbes_equation;
57
58 protected:
59 /// \brief The data specification
61
62 /// \brief The sequence of pbes equations
64
65 /// \brief The set of global variables
67
68 /// \brief The initial state
70
71 /// \brief Returns the predicate variables appearing in the left hand side of an equation.
72 /// \return The predicate variables appearing in the left hand side of an equation.
74 {
75 std::set<propositional_variable> result;
76 for (const pbes_equation& eqn: equations())
77 {
78 result.insert(eqn.variable());
79 }
80 return result;
81 }
82
83 /// \brief Checks if the propositional variable instantiation v appears with the right type in the
84 /// sequence of propositional variable declarations [first, last).
85 /// \param first Start of a sequence of propositional variable declarations
86 /// \param last End of a sequence of propositional variable declarations
87 /// \param v A propositional variable instantation
88 /// \param data_spec A data specification.
89 /// \return True if the type of \p v is matched correctly
90 /// \param v A propositional variable instantiation
91 template <typename Iter>
92 bool is_declared_in(Iter first, Iter last, const propositional_variable_instantiation& v, const data::data_specification& data_spec) const
93 {
94 for (Iter i = first; i != last; ++i)
95 {
96 if (i->name() == v.name() && data::detail::equal_sorts(i->parameters(), v.parameters(), data_spec))
97 {
98 return true;
99 }
100 }
101 return false;
102 }
103
104 public:
105 /// \brief Constructor.
106 pbes() = default;
107
108 /// \brief Constructor.
109 /// \param data A data specification
110 /// \param equations A sequence of pbes equations
111 /// \param initial_state A propositional variable instantiation
113 const std::vector<pbes_equation>& equations,
115 :
116 m_data(data),
118 m_initial_state(initial_state)
119 {
120 m_global_variables = pbes_system::find_free_variables(*this);
121 assert(core::detail::check_rule_PBES(pbes_to_aterm(*this)));
122 assert(is_well_typed());
123 }
124
125 /// \brief Constructor.
126 /// \param data A data specification
127 /// \param equations A sequence of pbes equations
128 /// \param global_variables A sequence of free variables
129 /// \param initial_state A propositional variable instantiation
131 const std::set<data::variable>& global_variables,
132 const std::vector<pbes_equation>& equations,
134 :
135 m_data(data),
138 m_initial_state(initial_state)
139 {
140 assert(core::detail::check_rule_PBES(pbes_to_aterm(*this)));
141 assert(is_well_typed());
142 }
143
144 /// \brief Returns the data specification.
145 /// \return The data specification of the pbes
146 const data::data_specification& data() const
147 {
148 return m_data;
149 }
150
151 /// \brief Returns the data specification.
152 /// \return The data specification of the pbes
154 {
155 return m_data;
156 }
157
158 /// \brief Returns the equations.
159 /// \return The equations.
161 {
162 return m_equations;
163 }
164
165 /// \brief Returns the equations.
166 /// \return The equations.
168 {
169 return m_equations;
170 }
171
172 /// \brief Returns the declared free variables of the pbes.
173 /// \return The declared free variables of the pbes.
175 {
176 return m_global_variables;
177 }
178
179 /// \brief Returns the declared free variables of the pbes.
180 /// \return The declared free variables of the pbes.
182 {
183 return m_global_variables;
184 }
185
186 /// \brief Returns the initial state.
187 /// \return The initial state.
189 {
190 return m_initial_state;
191 }
192
193 /// \brief Returns the initial state.
194 /// \return The initial state.
196 {
197 return m_initial_state;
198 }
199
200 /// \brief Returns the set of binding variables of the pbes.
201 /// This is the set variables that occur on the left hand side of an equation.
202 /// \return The set of binding variables of the pbes.
204 {
205 std::set<propositional_variable> result;
206 for (const pbes_equation& eqn: equations())
207 {
208 result.insert(eqn.variable());
209 }
210 return result;
211 }
212
213 /// \brief Returns the set of occurring propositional variable instantiations of the pbes.
214 /// This is the set of variables that occur in the right hand side of an equation.
215 /// \return The occurring propositional variable instantiations of the pbes
217
218 /// \brief Returns the set of occurring propositional variable declarations of the pbes, i.e.
219 /// the propositional variable declarations that occur in the right hand side of an equation.
220 /// \return The occurring propositional variable declarations of the pbes
222 {
223 std::set<propositional_variable> result;
224 std::set<propositional_variable_instantiation> occ = occurring_variable_instantiations();
225 std::map<core::identifier_string, propositional_variable> declared_variables;
226 for (const pbes_equation& eqn: equations())
227 {
228 declared_variables[eqn.variable().name()] = eqn.variable();
229 }
230 for (const propositional_variable_instantiation& v: occ)
231 {
232 result.insert(declared_variables[v.name()]);
233 }
234 return result;
235 }
236
237 /// \brief True if the pbes is closed
238 /// \return Returns true if all occurring variables are binding variables, and the initial state variable is a binding variable.
239 bool is_closed() const
240 {
241 std::set<propositional_variable> bnd = binding_variables();
242 std::set<propositional_variable> occ = occurring_variables();
243 return std::includes(bnd.begin(), bnd.end(), occ.begin(), occ.end()) && is_declared_in(bnd.begin(), bnd.end(), initial_state(), data());
244 }
245
246 /// \brief Checks if the PBES is well typed
247 /// \return True if
248 /// <ul>
249 /// <li>the sorts occurring in the free variables of the equations are declared in the data specification</li>
250 /// <li>the sorts occurring in the binding variable parameters are declared in the data specification </li>
251 /// <li>the sorts occurring in the quantifier variables of the equations are declared in the data specification </li>
252 /// <li>the binding variables of the equations have unique names (well formedness)</li>
253 /// <li>the global variables occurring in the equations are declared in global_variables()</li>
254 /// <li>the global variables occurring in the equations with the same name are identical</li>
255 /// <li>the declared global variables and the quantifier variables occurring in the equations have different names</li>
256 /// <li>the predicate variable instantiations occurring in the equations match with their declarations</li>
257 /// <li>the predicate variable instantiation occurring in the initial state matches with the declaration</li>
258 /// <li>the data specification is well typed</li>
259 /// </ul>
260 /// N.B. Conflicts between the types of instantiations and declarations of binding variables are not checked!
261 bool is_well_typed() const
262 {
263 std::set<data::sort_expression> declared_sorts = data::detail::make_set(data().sorts());
264 const std::set<data::variable>& declared_global_variables = global_variables();
265 std::set<data::variable> occurring_global_variables = pbes_system::find_free_variables(*this);
266 std::set<propositional_variable> declared_variables = compute_declared_variables();
267 std::set<propositional_variable_instantiation> occ = occurring_variable_instantiations();
268
269 // check 1), 4), 5), 6), 8) and 9)
270 if (!is_well_typed_pbes(declared_sorts, declared_global_variables, occurring_global_variables, declared_variables, occ, initial_state(), data()))
271 {
272 return false;
273 }
274
275 // check 2), 3) and 7)
276 for (const pbes_equation& eqn: equations())
277 {
278 if (!is_well_typed_equation(eqn, declared_sorts, declared_global_variables, data()))
279 {
280 return false;
281 }
282 }
283
284 // check 10)
285 return data().is_well_typed();
286 }
287};
288
289//--- start generated class pbes ---//
290// prototype declaration
291std::string pp(const pbes& x, bool precedence_aware = true);
292
293/// \\brief Outputs the object to a stream
294/// \\param out An output stream
295/// \\param x Object x
296/// \\return The output stream
297inline
299{
300 return out << pbes_system::pp(x);
301}
302//--- end generated class pbes ---//
303
304
305/// \brief Adds all sorts that appear in the PBES \a p to the data specification of \a p.
306/// \param p a PBES.
307inline
309{
310 std::set<data::sort_expression> s = pbes_system::find_sort_expressions(p);
311 p.data().add_context_sorts(s);
312}
313
314/// \brief Equality operator on PBESs
315/// \return True if the PBESs have exactly the same internal representation. Note
316/// that this is in general not a very useful test.
317// TODO: improve the comparison
318inline
319bool operator==(const pbes& p1, const pbes& p2)
320{
321 return pbes_to_aterm(p1) == pbes_to_aterm(p2);
322}
323
324} // namespace mcrl2::pbes_system
325
326
327
328#endif // MCRL2_PBES_PBES_H
A unordered_map class in which aterms can be stored.
bool is_well_typed() const
Returns true if.
\brief A data variable
Definition variable.h:25
\brief The and operator for pbes expressions
const pbes_expression & left() const
const pbes_expression & right() const
\brief The existential quantification operator for pbes expressions
const data::variable_list & variables() const
const pbes_expression & body() const
\brief The universal quantification operator for pbes expressions
const pbes_expression & body() const
const data::variable_list & variables() const
\brief The implication operator for pbes expressions
const pbes_expression & left() const
const pbes_expression & right() const
\brief The not operator for pbes expressions
const pbes_expression & operand() const
\brief The or operator for pbes expressions
const pbes_expression & left() const
const pbes_expression & right() const
const pbes_expression & formula() const
Returns the predicate formula on the right hand side of the equation.
bool is_solved() const
Returns true if the predicate formula on the right hand side contains no predicate variables.
Definition pbes.cpp:102
const propositional_variable & variable() const
Returns the pbes variable of the equation.
parameterized boolean equation system
Definition pbes.h:54
std::set< data::variable > & global_variables()
Returns the declared free variables of the pbes.
Definition pbes.h:181
bool is_closed() const
True if the pbes is closed.
Definition pbes.h:239
data::data_specification m_data
The data specification.
Definition pbes.h:60
pbes(const data::data_specification &data, const std::vector< pbes_equation > &equations, propositional_variable_instantiation initial_state)
Constructor.
Definition pbes.h:112
std::set< data::variable > m_global_variables
The set of global variables.
Definition pbes.h:66
std::set< propositional_variable > compute_declared_variables() const
Returns the predicate variables appearing in the left hand side of an equation.
Definition pbes.h:73
pbes(const data::data_specification &data, const std::set< data::variable > &global_variables, const std::vector< pbes_equation > &equations, propositional_variable_instantiation initial_state)
Constructor.
Definition pbes.h:130
const propositional_variable_instantiation & initial_state() const
Returns the initial state.
Definition pbes.h:188
std::set< propositional_variable > binding_variables() const
Returns the set of binding variables of the pbes. This is the set variables that occur on the left ha...
Definition pbes.h:203
std::set< propositional_variable > occurring_variables() const
Returns the set of occurring propositional variable declarations of the pbes, i.e....
Definition pbes.h:221
std::set< propositional_variable_instantiation > occurring_variable_instantiations() const
Returns the set of occurring propositional variable instantiations of the pbes. This is the set of va...
Definition pbes.cpp:107
const std::set< data::variable > & global_variables() const
Returns the declared free variables of the pbes.
Definition pbes.h:174
std::vector< pbes_equation > & equations()
Returns the equations.
Definition pbes.h:167
propositional_variable_instantiation & initial_state()
Returns the initial state.
Definition pbes.h:195
propositional_variable_instantiation m_initial_state
The initial state.
Definition pbes.h:69
pbes()=default
Constructor.
std::vector< pbes_equation > m_equations
The sequence of pbes equations.
Definition pbes.h:63
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 pbes.h:92
const std::vector< pbes_equation > & equations() const
Returns the equations.
Definition pbes.h:160
bool is_well_typed() const
Checks if the PBES is well typed.
Definition pbes.h:261
\brief A propositional variable instantiation
const data::data_expression_list & parameters() const
propositional_variable_instantiation(const propositional_variable_instantiation &) noexcept=default
Move semantics.
\brief A propositional variable declaration
const data::variable_list & parameters() const
const core::identifier_string & name() const
D_ParserTables parser_tables_mcrl2
void warn_and_or(const parse_node &)
Prints a warning for each occurrence of 'x && y || z' in the parse tree.
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:25
bool is_data_expression(const atermpp::aterm &x)
Test for a data_expression expression.
bool is_untyped_data_parameter(const atermpp::aterm &x)
void instantiate_global_variables(pbes &p)
Attempts to eliminate the free variables of a PBES, by substituting a constant value for them....
Definition pbes.cpp:64
bool is_bes(const pbes &x)
Returns true if a PBES is in BES form.
Definition pbes.cpp:69
untyped_pbes parse_pbes_new(const std::string &text)
Definition pbes.cpp:132
void complete_pbes(pbes &x)
Definition pbes.cpp:143
bool has_propositional_variables(const pbes_expression &x)
propositional_variable parse_propositional_variable(const std::string &text)
Definition pbes.cpp:150
pbes_expression parse_pbes_expression(const std::string &text)
Definition pbes.cpp:159
bool is_well_typed(const pbes_equation &eqn)
Checks if the equation is well typed.
pbes_expression parse_pbes_expression_new(const std::string &text)
Definition pbes.cpp:121
The main namespace for the PBES library.
std::set< data::variable > find_free_variables(const pbes_system::pbes_equation &x)
Definition pbes.cpp:55
std::string pp(const pbes_system::propositional_variable_list &x, bool arg0)
Definition pbes.cpp:30
std::string pp(const pbes_system::or_ &x, bool arg0)
Definition pbes.cpp:40
std::set< data::variable > find_free_variables(const pbes_system::pbes &x)
Definition pbes.cpp:53
void normalize_sorts(pbes_system::pbes_equation_vector &x, const data::sort_specification &sortspec)
Definition pbes.cpp:46
std::string pp(const pbes_system::imp &x, bool arg0)
Definition pbes.cpp:38
std::string pp(const pbes_system::propositional_variable_instantiation_list &x, bool arg0)
Definition pbes.cpp:32
pbes_system::pbes_expression normalize_sorts(const pbes_system::pbes_expression &x, const data::sort_specification &sortspec)
Definition pbes.cpp:48
std::set< data::sort_expression > find_sort_expressions(const pbes_system::pbes &x)
Definition pbes.cpp:51
std::string pp(const pbes_system::pbes_equation_vector &x, bool arg0)
Definition pbes.cpp:27
std::string pp(const pbes_system::pbes_expression_list &x, bool arg0)
Definition pbes.cpp:28
bool is_not(const atermpp::aterm &x)
std::set< pbes_system::propositional_variable_instantiation > find_propositional_variable_instantiations(const pbes_system::pbes_expression &x)
Definition pbes.cpp:57
bool is_exists(const atermpp::aterm &x)
void normalize_sorts(pbes_system::pbes &x, const data::sort_specification &)
Definition pbes.cpp:47
std::ostream & operator<<(std::ostream &out, const pbes &x)
Definition pbes.h:298
bool is_or(const atermpp::aterm &x)
bool is_well_typed_pbes(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 pbes.cpp:90
std::set< data::function_symbol > find_function_symbols(const pbes_system::pbes &x)
Definition pbes.cpp:56
bool is_forall(const atermpp::aterm &x)
void typecheck_pbes(pbes &pbesspec)
Type check a parsed mCRL2 pbes specification. Throws an exception if something went wrong.
Definition typecheck.h:272
std::string pp(const pbes_system::propositional_variable &x, bool arg0)
Definition pbes.cpp:44
std::string pp(const pbes_system::exists &x, bool arg0)
Definition pbes.cpp:35
std::string pp(const pbes_system::pbes_expression &x, bool arg0)
Definition pbes.cpp:43
atermpp::aterm pbes_to_aterm(const pbes &p)
Conversion to atermappl.
Definition io.cpp:315
bool operator==(const pbes &p1, const pbes &p2)
Equality operator on PBESs.
Definition pbes.h:319
bool is_well_typed(const pbes_equation &eqn)
Definition pbes.cpp:76
std::set< data::variable > find_free_variables(const pbes_system::pbes_expression &x)
Definition pbes.cpp:54
pbes_system::pbes_expression translate_user_notation(const pbes_system::pbes_expression &x)
Definition pbes.cpp:50
bool search_variable(const pbes_system::pbes_expression &x, const data::variable &v)
Definition pbes.cpp:59
std::set< data::variable > find_all_variables(const pbes_system::pbes &x)
Definition pbes.cpp:52
std::string pp(const pbes_system::not_ &x, bool arg0)
Definition pbes.cpp:39
void complete_data_specification(pbes &)
Adds all sorts that appear in the PBES p to the data specification of p.
Definition pbes.h:308
std::string pp(const pbes_system::pbes_equation &x, bool arg0)
Definition pbes.cpp:42
std::set< core::identifier_string > find_identifiers(const pbes_system::pbes_expression &x)
Definition pbes.cpp:58
bool is_propositional_variable_instantiation(const atermpp::aterm &x)
bool is_well_typed_equation(const pbes_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 pbes.cpp:81
std::string pp(const pbes_system::propositional_variable_instantiation &x, bool arg0)
Definition pbes.cpp:45
bool is_and(const atermpp::aterm &x)
void translate_user_notation(pbes_system::pbes &x)
Definition pbes.cpp:49
std::string pp(const pbes_system::pbes &x, bool arg0)
Definition pbes.cpp:41
bool is_imp(const atermpp::aterm &x)
std::string pp(const pbes_system::and_ &x, bool arg0)
Definition pbes.cpp:34
std::string pp(const pbes_system::fixpoint_symbol &x, bool arg0)
Definition pbes.cpp:36
std::string pp(const pbes_system::forall &x, bool arg0)
Definition pbes.cpp:37
expression traverser that visits all sub expressions
Definition traverser.h:29
void apply(const pbes_system::imp &x)
Definition traverser.h:236
void apply(const pbes_system::not_ &x)
Definition traverser.h:213
void apply(const pbes_system::propositional_variable_instantiation &x)
Definition traverser.h:206
void apply(const pbes_system::exists &x)
Definition traverser.h:251
void apply(const pbes_system::pbes &x)
Definition traverser.h:198
void apply(const pbes_system::pbes_equation &x)
Definition traverser.h:191
void apply(const pbes_system::pbes_expression &x)
Definition traverser.h:258
void apply(const pbes_system::or_ &x)
Definition traverser.h:228
void apply(const pbes_system::and_ &x)
Definition traverser.h:220
void apply(const pbes_system::forall &x)
Definition traverser.h:244
void apply(const pbes_system::pbes_expression &x)
Definition traverser.h:662
void apply(const pbes_system::exists &x)
Definition traverser.h:654
void apply(const pbes_system::propositional_variable &x)
Definition traverser.h:582
void apply(const pbes_system::forall &x)
Definition traverser.h:646
void apply(const pbes_system::pbes_equation &x)
Definition traverser.h:590
void apply(const pbes_system::propositional_variable_instantiation &x)
Definition traverser.h:607
void apply(const pbes_system::propositional_variable_instantiation &x)
Definition traverser.h:332
void apply(const pbes_system::and_ &x)
Definition traverser.h:346
void apply(const pbes_system::forall &x)
Definition traverser.h:370
void apply(const pbes_system::pbes_equation &x)
Definition traverser.h:318
void apply(const pbes_system::or_ &x)
Definition traverser.h:354
void apply(const pbes_system::imp &x)
Definition traverser.h:362
void apply(const pbes_system::pbes_expression &x)
Definition traverser.h:384
void apply(const pbes_system::exists &x)
Definition traverser.h:377
void apply(const pbes_system::not_ &x)
Definition traverser.h:339
void apply(const pbes_system::pbes &x)
Definition traverser.h:325
void apply(const pbes_system::exists &x)
Definition traverser.h:123
void apply(const pbes_system::or_ &x)
Definition traverser.h:99
void apply(const pbes_system::propositional_variable_instantiation &x)
Definition traverser.h:77
void apply(const pbes_system::propositional_variable &x)
Definition traverser.h:53
void apply(const pbes_system::imp &x)
Definition traverser.h:107
void apply(const pbes_system::and_ &x)
Definition traverser.h:91
void apply(const pbes_system::pbes &x)
Definition traverser.h:68
void apply(const pbes_system::forall &x)
Definition traverser.h:115
void apply(const pbes_system::pbes_equation &x)
Definition traverser.h:60
void apply(const pbes_system::pbes_expression &x)
Definition traverser.h:131
void apply(const pbes_system::not_ &x)
Definition traverser.h:84
void apply(const pbes_system::pbes &x)
Definition traverser.h:459
void apply(const pbes_system::propositional_variable &x)
Definition traverser.h:444
void apply(const pbes_system::or_ &x)
Definition traverser.h:490
void apply(const pbes_system::propositional_variable_instantiation &x)
Definition traverser.h:468
void apply(const pbes_system::not_ &x)
Definition traverser.h:475
void apply(const pbes_system::exists &x)
Definition traverser.h:514
void apply(const pbes_system::and_ &x)
Definition traverser.h:482
void apply(const pbes_system::imp &x)
Definition traverser.h:498
void apply(const pbes_system::pbes_expression &x)
Definition traverser.h:522
void apply(const pbes_system::pbes_equation &x)
Definition traverser.h:451
void apply(const pbes_system::forall &x)
Definition traverser.h:506
pbes_system::propositional_variable parse_PropVarDecl(const core::parse_node &node) const
Definition parse_impl.h:47
pbes_actions(const core::parser &parser_)
Definition parse_impl.h:25
untyped_pbes parse_PbesSpec(const core::parse_node &node) const
Definition parse_impl.h:84
pbes_system::pbes_expression parse_PbesExpr(const core::parse_node &node) const
Definition parse_impl.h:29
Traversal class for pbes_expressions. Used as a base class for pbes_expression_traverser.
Definition traverser.h:23
void apply(const data::data_expression &x)
Definition traverser.h:29
void apply(const data::untyped_data_parameter &x)
Definition traverser.h:36