mCRL2
Loading...
Searching...
No Matches
lps2pbes_rhs.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/detail/lps2pbes_rhs.h
10/// \brief add your file description here.
11
12#ifndef MCRL2_PBES_DETAIL_LPS2PBES_RHS_H
13#define MCRL2_PBES_DETAIL_LPS2PBES_RHS_H
14
15#include "mcrl2/atermpp/aterm.h"
16#include "mcrl2/data/consistency.h"
17#include "mcrl2/data/data_expression.h"
18#include "mcrl2/pbes/detail/lps2pbes_par.h"
19#include "mcrl2/pbes/detail/lps2pbes_sat.h"
20#include "mcrl2/pbes/replace.h"
21
22
23
24
25
26namespace mcrl2::pbes_system::detail {
27
29{
30 const state_formulas::state_formula& phi0; // the original formula
33 const data::variable& T;
34
36 const lps::stochastic_linear_process& lps_,
37 data::set_identifier_generator& id_generator_,
38 const data::variable& T_
39 )
40 : phi0(phi0_), lps(lps_), id_generator(id_generator_), T(T_)
41 {}
42
43 bool is_timed() const
44 {
46 }
47
48 template <typename TermTraits>
50 const data::variable_list& y,
51 const pbes_expression& left, // Sat(ai(fi(x,y)) && ci(x,y) && (ti(x,y) > T)
52 const pbes_expression& right, // RHS(phi)[T, x := ti(x,y), gi(x,y)]
53 const lps::multi_action& /* ai */,
54 const data::assignment_list& /* gi */,
55 TermTraits
56 )
57 {
58 using tr = TermTraits;
59 if (is_must)
60 {
61 return tr::forall(y, tr::imp(left, right));
62 }
63 else
64 {
65 return tr::exists(y, tr::and_(left, right));
66 }
67 }
68};
69
71{
72 data::variable_list d1; // d'
73 data::mutable_map_substitution<> sigma; // the substitution [d := d'], where d is the sequence of process parameters of lps
74 std::map<lps::multi_action, propositional_variable> Zpos; // represents the additional equations { nu Zpos_ai(d, fi(x,y), d') = true }
75 std::map<lps::multi_action, propositional_variable> Zneg; // represents the additional equations { nu Zneg_ai(d, fi(x,y), d') = false }
76
77 // creates variables corresponding to the action label sorts in actions
78 data::variable_list action_variables(const process::action_list& actions) const
79 {
80 std::vector<data::variable> result;
81 for (const process::action& a: actions)
82 {
83 for (const data::sort_expression& s: a.label().sorts())
84 {
85 data::variable v(id_generator("v"), s);
86 result.push_back(v);
87 }
88 }
89 return data::variable_list(result.begin(), result.end());
90 }
91
92 // returns the concatenation of the arguments of the list of actions
93 data::data_expression_list action_expressions(const process::action_list& actions) const
94 {
95 std::vector<data::data_expression> result;
96 for (const process::action& a: actions)
97 {
98 auto const& args = a.arguments();
99 result.insert(result.end(), args.begin(), args.end());
100 }
101 return data::data_expression_list(result.begin(), result.end());
102 }
103
104 // returns the equations needed for counter example generation
106 {
107 std::vector<pbes_equation> result;
108 for (auto const& p: Zneg)
109 {
110 pbes_equation eqn(fixpoint_symbol::nu(), p.second, false_());
111 result.push_back(eqn);
112 }
113 for (auto const& p: Zpos)
114 {
115 pbes_equation eqn(fixpoint_symbol::nu(), p.second, true_());
116 result.push_back(eqn);
117 }
118 return result;
119 }
120
122 {
123 std::vector<std::string> v;
124 for (const process::action& ai: a.actions())
125 {
126 v.emplace_back(ai.label().name());
127 }
128 return utilities::string_join(v, "_");
129 }
130
132 const lps::stochastic_linear_process& lps,
133 data::set_identifier_generator& id_generator,
134 const data::variable& T
135 )
136 : lps2pbes_parameters(phi0, lps, id_generator, T)
137 {
138 const data::variable_list& d = lps.process_parameters();
139 sigma = detail::make_fresh_variable_substitution(d, id_generator);
140 d1 = data::replace_variables(d, sigma);
141
142 std::size_t index = 0;
143 for (const lps::action_summand& summand: lps.action_summands())
144 {
145 const lps::multi_action& ai = summand.multi_action();
146 data::variable_list actvars = action_variables(ai.actions());
147 core::identifier_string pos = id_generator("Zpos_" + utilities::number2string(index) + "_" + multi_action_name(ai));
148 core::identifier_string neg = id_generator("Zneg_" + utilities::number2string(index) + "_" + multi_action_name(ai));
149 Zpos[ai] = propositional_variable(pos, d + actvars + d1);
150 Zneg[ai] = propositional_variable(neg, d + actvars + d1);
151 index++;
152 }
153 }
154
155 data::data_expression equal_to(const data::variable_list& d, const data::data_expression_list& e) const
156 {
157 std::vector<data::data_expression> v;
158 auto i = d.begin();
159 auto j = e.begin();
160 for (; i != d.end(); ++i, ++j)
161 {
162 v.push_back(data::equal_to(*i, *j));
163 }
164 return data::lazy::join_and(v.begin(), v.end());
165 }
166
167 template <typename TermTraits>
169 const data::variable_list& y,
170 const pbes_expression& left, // Sat(ai(fi(x,y)) && ci(x,y) && (ti(x,y) > T)
171 const pbes_expression& right, // RHS(phi)[T, x := ti(x,y), gi(x,y)]
172 const lps::multi_action& ai,
173 const data::assignment_list& gi,
174 TermTraits
175 )
176 {
177 using tr = TermTraits;
178 const data::variable_list& d = lps.process_parameters();
179 auto de = data::data_expression_list(d);
180
181 data::data_expression_list gi1 = data::replace_variables(de, data::assignment_sequence_substitution(gi));
182 auto fi = action_expressions(ai.actions());
183 data::data_expression_list da = data::data_expression_list(de) + fi + gi1;
184 propositional_variable_instantiation Pos(Zpos.at(ai).name(), da);
185 propositional_variable_instantiation Neg(Zneg.at(ai).name(), da);
186 auto right1 = right;
187
188 if (is_must)
189 {
190 right1 = tr::or_(tr::and_(right, Pos), Neg);
191 return tr::forall(y, tr::imp(left, right1));
192 }
193 else
194 {
195 right1 = tr::and_(tr::or_(right, Neg), Pos);
196 return tr::exists(y, tr::and_(left, right1));
197 }
198 }
199};
200
201//--- RHS default variant ---//
202
203template <typename TermTraits, typename Parameters>
204pbes_expression RHS(const state_formulas::state_formula& x, Parameters& parameters, TermTraits tr);
205
206template <typename Derived, typename TermTraits, typename Parameters>
208{
210 using tr = TermTraits;
211 using pbes_expression = typename tr::term_type;
212
213 using super::enter;
214 using super::leave;
215 using super::apply;
216
217 Parameters& parameters;
219
220 rhs_traverser(Parameters& parameters_, TermTraits)
221 : parameters(parameters_)
222 {}
223
224 Derived& derived()
225 {
226 return static_cast<Derived&>(*this);
227 }
228
229 void push(const pbes_expression& x)
230 {
231 result_stack.push_back(x);
232 }
233
234 pbes_expression& top()
235 {
236 return result_stack.back();
237 }
238
239 const pbes_expression& top() const
240 {
241 return result_stack.back();
242 }
243
244 pbes_expression pop()
245 {
246 pbes_expression result = top();
247 result_stack.pop_back();
248 return result;
249 }
250
251 void push_variables(const data::variable_list& variables)
252 {
253 for (const data::variable& v: variables)
254 {
255 parameters.id_generator.add_identifier(v.name());
256 }
257 }
258
259 void pop_variables(const data::variable_list& variables)
260 {
261 for (const data::variable& v: variables)
262 {
263 parameters.id_generator.remove_identifier(v.name());
264 }
265 }
266
267 bool is_timed() const
268 {
270 }
271
272 void leave(const data::data_expression& x)
273 {
274 push(atermpp::down_cast<pbes_expression>(x));
275 }
276
278 {
280 }
281
283 {
285 }
286
288 {
289 throw mcrl2::runtime_error("rhs_traverser: negation is not supported!");
290 }
291
293 {
294 pbes_expression right = pop();
295 pbes_expression left = pop();
296 push(tr::and_(left, right));
297 }
298
300 {
301 pbes_expression right = pop();
302 pbes_expression left = pop();
303 push(tr::or_(left, right));
304 }
305
307 {
308 throw mcrl2::runtime_error("rhs_traverser: implication is not supported!");
309 }
310
312 {
313 derived().enter(x);
315 derived().apply(x.body());
316 tr::make_forall(top(), x.variables(), top());
317 derived().leave(x);
318 }
319
321 {
322 derived().enter(x);
324 derived().apply(x.body());
325 tr::make_exists(top(), x.variables(), top());
326 derived().leave(x);
327 }
328
329 // This function is overridden in the structured variant of the algorithm
330 template <typename MustMayExpression>
331 pbes_expression apply_may_must_rhs(const MustMayExpression& x)
332 {
333 return RHS(x.operand(), parameters, TermTraits());
334 }
335
336 // This function is overridden in the structured variant of the algorithm
337 pbes_expression apply_may_must_result(const pbes_expression& p)
338 {
339 return p;
340 }
341
342 // share code between must and may
343 template <typename MustMayExpression>
344 void apply_may_must(const MustMayExpression& x, bool is_must)
345 {
346 bool timed = is_timed();
347 std::vector<pbes_expression> v;
348 pbes_expression rhs_phi = derived().apply_may_must_rhs(x);
349 assert(action_formulas::is_action_formula(x.formula()));
350 const action_formulas::action_formula& alpha = atermpp::down_cast<const action_formulas::action_formula>(x.formula());
351
352 for (const lps::action_summand& summand: parameters.lps.action_summands())
353 {
354 const data::data_expression& ci = summand.condition();
355 const lps::multi_action& ai = summand.multi_action();
356 const data::assignment_list& gi = summand.assignments();
357 const data::variable_list& yi = summand.summation_variables();
358
359 pbes_expression right = rhs_phi;
360 const data::data_expression& ti = ai.time();
361 pbes_expression sat = Sat(ai, alpha, parameters.id_generator, TermTraits());
362 data::mutable_map_substitution<> sigma;
363 for (const data::assignment& a: gi)
364 {
365 sigma[a.lhs()] = a.rhs();
366 }
367 pbes_expression left = tr::and_(sat, atermpp::down_cast<pbes_expression>(ci));
368
369 if (timed)
370 {
371 sigma[parameters.T] = ti;
372 left = tr::and_(left, atermpp::down_cast<pbes_expression>(data::greater(ti, parameters.T)));
373 }
374
375 right = pbes_system::replace_variables_capture_avoiding(right, sigma);
376
377 pbes_expression p = parameters.rhs_may_must(is_must, yi, left, right, ai, gi, TermTraits());
378 v.push_back(derived().apply_may_must_result(p));
379 }
380
381 pbes_expression result = is_must ? tr::join_and(v.begin(), v.end()) : tr::join_or(v.begin(), v.end());
382 push(result);
383 }
384
385 void apply(const state_formulas::must& x)
386 {
387 apply_may_must(x, true);
388 }
389
390 void apply(const state_formulas::may& x)
391 {
392 apply_may_must(x, false);
393 }
394
396 {
397 throw mcrl2::runtime_error("rhs_traverser: yaled is not supported!");
398 }
399
401 {
403 std::vector<pbes_expression> v;
404 for (const lps::action_summand& i: parameters.lps.action_summands())
405 {
406 const data::data_expression& ci = i.condition();
407 const data::data_expression& ti = i.multi_action().time();
408 const data::variable_list& yi = i.summation_variables();
409 pbes_expression p = tr::forall(yi, tr::or_(tr::not_(atermpp::down_cast<pbes_expression>(ci)), atermpp::down_cast<pbes_expression>(data::greater(t, ti))));
410 v.push_back(p);
411 }
412 for (const lps::deadlock_summand& j: parameters.lps.deadlock_summands())
413 {
414 const data::data_expression& cj = j.condition();
415 const data::data_expression& tj = j.deadlock().time();
416 const data::variable_list& yj = j.summation_variables();
417 pbes_expression p = tr::forall(yj, tr::or_(tr::not_(atermpp::down_cast<pbes_expression>(cj)), atermpp::down_cast<pbes_expression>(data::greater(t, tj))));
418 v.push_back(p);
419 }
420 push(tr::and_(tr::join_or(v.begin(), v.end()), atermpp::down_cast<pbes_expression>(data::greater(t, parameters.T))));
421 }
422
424 {
425 throw mcrl2::runtime_error("rhs_traverser: delay is not supported!");
426 }
427
429 {
431 std::vector<pbes_expression> v;
432 for (const lps::action_summand& i : parameters.lps.action_summands())
433 {
434 const data::data_expression& ci = i.condition();
435 data::data_expression ti = i.multi_action().time();
436 const data::variable_list& yi = i.summation_variables();
437 pbes_expression p = tr::exists(yi, tr::and_(atermpp::down_cast<pbes_expression>(ci), atermpp::down_cast<pbes_expression>(data::less_equal(t, ti))));
438 v.push_back(p);
439 }
440 for (const lps::deadlock_summand& j: parameters.lps.deadlock_summands())
441 {
442 const data::data_expression& cj = j.condition();
443 data::data_expression tj = j.deadlock().time();
444 const data::variable_list& yj = j.summation_variables();
445 pbes_expression p = tr::exists(yj, tr::and_(atermpp::down_cast<pbes_expression>(cj), atermpp::down_cast<pbes_expression>(data::less_equal(t, tj))));
446 v.push_back(p);
447 }
448 push(tr::or_(tr::join_or(v.begin(), v.end()), atermpp::down_cast<pbes_expression>(data::less_equal(t, parameters.T))));
449 }
450
452 {
453 const core::identifier_string& X = x.name();
454 const data::data_expression_list& d = x.arguments();
455 data::variable_list xp = parameters.lps.process_parameters();
456 data::data_expression_list e = d + xp + Par(X, data::variable_list(), parameters.phi0);
457 if (is_timed())
458 {
459 e.push_front(parameters.T);
460 }
461 push(propositional_variable_instantiation(X, e));
462 }
463
464 void apply(const state_formulas::nu& x)
465 {
466 const core::identifier_string& X = x.name();
467 data::data_expression_list d = detail::mu_expressions(x);
468 data::variable_list xp = parameters.lps.process_parameters();
469 data::data_expression_list e = d + xp + Par(X, data::variable_list(), parameters.phi0);
470 if (is_timed())
471 {
472 e.push_front(parameters.T);
473 }
474 push(propositional_variable_instantiation(X, e));
475 }
476
477 void apply(const state_formulas::mu& x)
478 {
479 const core::identifier_string& X = x.name();
480 data::data_expression_list d = detail::mu_expressions(x);
481 data::variable_list xp = parameters.lps.process_parameters();
482 data::data_expression_list e = d + xp + Par(X, data::variable_list(), parameters.phi0);
483 if (is_timed())
484 {
485 e.push_front(parameters.T);
486 }
487 push(propositional_variable_instantiation(X, e));
488 }
489};
490
491template <template <class, class, class> class Traverser, typename TermTraits, typename Parameters>
493{
495 using super::enter;
496 using super::leave;
497 using super::apply;
498
499 apply_rhs_traverser(Parameters& parameters, TermTraits tr)
501 {}
502};
503
504template <typename TermTraits, typename Parameters>
505inline
506pbes_expression RHS(const state_formulas::state_formula& x, Parameters& parameters, TermTraits tr)
507{
508 apply_rhs_traverser<rhs_traverser, TermTraits, Parameters> f(parameters, tr);
509 f.apply(x);
510 return f.top();
511}
512
513//--- RHS_structured variant ---//
514
515template <typename TermTraits, typename Parameters>
516inline
517typename TermTraits::term_type RHS_structured(const state_formulas::state_formula& x,
518 Parameters& parameters,
519 const data::variable_list& variables,
520 const fixpoint_symbol& sigma,
521 std::vector<pbes_equation>& equations,
522 TermTraits tr
523 );
524
525template <typename Derived, typename TermTraits, typename Parameters>
526struct rhs_structured_traverser: public rhs_traverser<Derived, TermTraits, Parameters>
527{
528 using super = rhs_traverser<Derived, TermTraits, Parameters>;
529 using tr = TermTraits;
530
531 using super::enter;
532 using super::leave;
533 using super::apply;
534 using super::push;
535 using super::top;
536 using super::pop;
537 using super::is_timed;
538 using super::parameters;
539 using super::apply_may_must;
540 using super::derived;
541
544 std::vector<pbes_equation>& equations; // new equations that are generated on the fly
545
546 rhs_structured_traverser(Parameters& parameters,
547 const data::variable_list& variables_,
548 const fixpoint_symbol& sigma_,
549 std::vector<pbes_equation>& equations_,
550 TermTraits tr
551 )
552 : super(parameters, tr),
554 sigma(sigma_),
556 {}
557
558 data::variable_list rhs_structured_compute_variables(const state_formulas::state_formula& x, const std::multiset<data::variable>& variables) const
559 {
560 std::set<data::variable> fv = state_formulas::find_free_variables(x);
561 fv.insert(variables.begin(), variables.end());
562 return data::variable_list(fv.begin(), fv.end());
563 }
564
566 {
567 const data::variable_list& v = x.variables();
568 variables.insert(v.begin(), v.end());
569 }
570
572 {
573 for (const data::variable& var: x.variables())
574 {
575 variables.erase(var);
576 }
577 }
578
580 {
581 const data::variable_list& v = x.variables();
582 variables.insert(v.begin(), v.end());
583 }
584
586 {
587 for (const data::variable& var: x.variables())
588 {
589 variables.erase(var);
590 }
591 }
592
593 // override
594 template <typename MustMayExpression>
595 pbes_expression apply_may_must_rhs(const MustMayExpression& x)
596 {
597 return RHS_structured(x.operand(), parameters, rhs_structured_compute_variables(x.operand(), variables), sigma, equations, TermTraits());
598 }
599
600 // override
602 {
603 // generate a new equation 'Y(d) = p', and add Y(d) to v
604 core::identifier_string Y = parameters.id_generator("Y");
605 data::variable_list d(variables.begin(), variables.end());
606 propositional_variable Yd(Y, d);
607 pbes_equation eqn(sigma, Yd, p);
608 equations.push_back(eqn);
609 return propositional_variable_instantiation(Y, data::make_data_expression_list(d));
610 }
611
612 void apply(const state_formulas::must& x)
613 {
614 apply_may_must(x, true);
615 }
616
617 void apply(const state_formulas::may& x)
618 {
619 apply_may_must(x, false);
620 }
621};
622
623template <template <class, class, class> class Traverser, typename TermTraits, typename Parameters>
625{
627 using super::enter;
628 using super::leave;
629 using super::apply;
630
631 apply_rhs_structured_traverser(Parameters& parameters,
632 const data::variable_list& variables,
633 const fixpoint_symbol& sigma,
634 std::vector<pbes_equation>& equations,
635 TermTraits tr
636 )
638 {}
639};
640
641template <typename TermTraits, typename Parameters>
642inline
644 Parameters& parameters,
645 const data::variable_list& variables,
646 const fixpoint_symbol& sigma,
647 std::vector<pbes_equation>& equations,
648 TermTraits tr
649 )
650{
651 apply_rhs_structured_traverser<rhs_structured_traverser, TermTraits, Parameters> f(parameters, variables, sigma, equations, tr);
652 f.apply(x);
653 return f.top();
654}
655
656} // namespace mcrl2::pbes_system::detail
657
658
659
660
661
662#endif // MCRL2_PBES_DETAIL_LPS2PBES_RHS_H
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
\brief A data variable
Definition variable.h:25
LPS summand containing a multi-action.
const data::assignment_list & assignments() const
Returns the sequence of assignments.
LPS summand containing a deadlock.
const data::data_expression & time() const
Returns the time.
Definition deadlock.h:46
\brief A timed multi-action
const data::data_expression & time() const
pbes_equation(const fixpoint_symbol &symbol, const propositional_variable &variable, const pbes_expression &expr)
Constructor.
\brief A propositional variable instantiation
\brief A propositional variable declaration
\brief The and operator for state formulas
\brief The timed delay operator for state formulas
const data::data_expression & time_stamp() const
\brief The delay operator for state formulas
\brief The existential quantification operator for state formulas
const state_formula & body() const
const data::variable_list & variables() const
\brief The value false for state formulas
\brief The universal quantification operator for state formulas
const state_formula & body() const
const data::variable_list & variables() const
\brief The implication operator for state formulas
\brief The may operator for state formulas
\brief The mu operator for state formulas
const core::identifier_string & name() const
\brief The must operator for state formulas
\brief The not operator for state formulas
\brief The nu operator for state formulas
const core::identifier_string & name() const
\brief The or operator for state formulas
\brief The value true for state formulas
\brief The state formula variable
const core::identifier_string & name() const
const data::data_expression_list & arguments() const
\brief The timed yaled operator for state formulas
const data::data_expression & time_stamp() const
\brief The yaled operator for state formulas
bool is_action_formula(const atermpp::aterm &x)
const data::variable & undefined_real_variable()
Returns a data variable that corresponds to 'undefined'.
Definition undefined.h:42
The main namespace for the LPS library.
Definition constelm.h:18
pbes_expression RHS(const state_formulas::state_formula &x, Parameters &parameters, TermTraits tr)
TermTraits::term_type RHS_structured(const state_formulas::state_formula &x, Parameters &parameters, const data::variable_list &variables, const fixpoint_symbol &sigma, std::vector< pbes_equation > &equations, TermTraits tr)
const pbes_expression & true_()
const pbes_expression & false_()
The main namespace for the Process library.
apply_rhs_structured_traverser(Parameters &parameters, const data::variable_list &variables, const fixpoint_symbol &sigma, std::vector< pbes_equation > &equations, TermTraits tr)
apply_rhs_traverser(Parameters &parameters, TermTraits tr)
std::string multi_action_name(const lps::multi_action &a) const
data::data_expression equal_to(const data::variable_list &d, const data::data_expression_list &e) const
std::map< lps::multi_action, propositional_variable > Zneg
lps2pbes_counter_example_parameters(const state_formulas::state_formula &phi0, const lps::stochastic_linear_process &lps, data::set_identifier_generator &id_generator, const data::variable &T)
std::map< lps::multi_action, propositional_variable > Zpos
data::variable_list action_variables(const process::action_list &actions) const
pbes_expression rhs_may_must(bool is_must, const data::variable_list &y, const pbes_expression &left, const pbes_expression &right, const lps::multi_action &ai, const data::assignment_list &gi, TermTraits)
data::data_expression_list action_expressions(const process::action_list &actions) const
pbes_expression rhs_may_must(bool is_must, const data::variable_list &y, const pbes_expression &left, const pbes_expression &right, const lps::multi_action &, const data::assignment_list &, TermTraits)
const state_formulas::state_formula & phi0
lps2pbes_parameters(const state_formulas::state_formula &phi0_, const lps::stochastic_linear_process &lps_, data::set_identifier_generator &id_generator_, const data::variable &T_)
data::set_identifier_generator & id_generator
pbes_expression apply_may_must_rhs(const MustMayExpression &x)
void leave(const state_formulas::forall &x)
data::variable_list rhs_structured_compute_variables(const state_formulas::state_formula &x, const std::multiset< data::variable > &variables) const
void leave(const state_formulas::exists &x)
rhs_structured_traverser(Parameters &parameters, const data::variable_list &variables_, const fixpoint_symbol &sigma_, std::vector< pbes_equation > &equations_, TermTraits tr)
void enter(const state_formulas::forall &x)
void enter(const state_formulas::exists &x)
pbes_expression apply_may_must_result(const pbes_expression &p)
void apply(const state_formulas::must &x)
void apply(const state_formulas::not_ &)
pbes_expression apply_may_must_rhs(const MustMayExpression &x)
void leave(const state_formulas::delay_timed &x)
void apply(const state_formulas::must &x)
void apply(const state_formulas::may &x)
void push(const pbes_expression &x)
rhs_traverser(Parameters &parameters_, TermTraits)
void apply_may_must(const MustMayExpression &x, bool is_must)
void leave(const state_formulas::or_ &)
void leave(const state_formulas::yaled_timed &x)
void pop_variables(const data::variable_list &variables)
void apply(const state_formulas::forall &x)
void leave(const state_formulas::true_ &)
void apply(const state_formulas::mu &x)
void apply(const state_formulas::exists &x)
std::vector< pbes_expression > result_stack
void apply(const state_formulas::imp &)
void push_variables(const data::variable_list &variables)
void leave(const state_formulas::and_ &)
void apply(const state_formulas::nu &x)
pbes_expression apply_may_must_result(const pbes_expression &p)
void leave(const state_formulas::yaled &)
void leave(const state_formulas::false_ &)
void leave(const state_formulas::delay &)
const pbes_expression & top() const
void leave(const state_formulas::variable &x)
void leave(const data::data_expression &x)