12#ifndef MCRL2_PBES_DETAIL_LPS2PBES_SAT_H
13#define MCRL2_PBES_DETAIL_LPS2PBES_SAT_H
15#include "mcrl2/data/detail/data_utility.h"
16#include "mcrl2/data/detail/find.h"
17#include "mcrl2/modal_formula/replace.h"
18#include "mcrl2/pbes/detail/lps2pbes_utility.h"
26template <
typename TermTraits>
33template <
typename Derived,
typename TermTraits>
37 using tr = TermTraits;
38 using expression_type =
typename tr::term_type;
54 return static_cast<Derived&>(*
this);
57 void push(
const expression_type& x)
59 result_stack.push_back(x);
62 const expression_type&
top()
const
64 return result_stack.back();
69 expression_type result =
top();
70 result_stack.pop_back();
76 push(atermpp::down_cast<pbes_expression>(x));
81 push(atermpp::down_cast<pbes_expression>(lps::equal_multi_actions(a, lps::multi_action(x.actions()))));
101 expression_type right =
pop();
102 expression_type left =
pop();
103 push(tr::and_(left, right)
);
108 expression_type right =
pop();
109 expression_type left =
pop();
110 push(tr::or_(left, right)
);
115 expression_type right =
pop();
116 expression_type left =
pop();
117 push(tr::imp(left, right)
);
122 data::mutable_map_substitution<> sigma_x = pbes_system::detail::make_fresh_variable_substitution(x.variables(), id_generator,
false);
124 data::variable_list y = data::replace_variables(x.variables(), sigma_x);
127 tr::make_forall(result, y, Sat(a, action_formulas::replace_variables_capture_avoiding(alpha, sigma_x), id_generator, TermTraits()));
133 data::mutable_map_substitution<> sigma_x = pbes_system::detail::make_fresh_variable_substitution(x.variables(), id_generator,
false);
135 data::variable_list y = data::replace_variables(x.variables(), sigma_x);
138 tr::make_exists(result, y, Sat(a, action_formulas::replace_variables_capture_avoiding(alpha, sigma_x), id_generator, TermTraits()));
147 push(tr::and_(Sat(a, alpha, id_generator, TermTraits()), atermpp::down_cast<pbes_expression>(data::equal_to(t, u))));
151template <
template <
class,
class>
class Traverser,
typename TermTraits>
165template <
typename TermTraits>
172 apply_sat_traverser<sat_traverser, TermTraits> f(a, id_generator, tr);
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
\brief A timed multi-action
const data::data_expression & time() const
The main namespace for the LPS library.
TermTraits::term_type Sat(const lps::multi_action &a, const action_formulas::action_formula &x, data::set_identifier_generator &id_generator, TermTraits tr)
const pbes_expression & true_()
const pbes_expression & false_()
apply_sat_traverser(const lps::multi_action &a, data::set_identifier_generator &id_generator, TermTraits tr)
void apply(const action_formulas::forall &x)
const expression_type & top() const
void leave(const action_formulas::true_ &)
std::vector< expression_type > result_stack
void apply(const action_formulas::not_ &x)
void leave(const action_formulas::and_ &)
void leave(const action_formulas::or_ &)
sat_traverser(const lps::multi_action &a_, data::set_identifier_generator &id_generator_, TermTraits)
data::set_identifier_generator & id_generator
void push(const expression_type &x)
void apply(const action_formulas::at &x)
void leave(const data::data_expression &x)
void leave(const action_formulas::imp &)
void leave(const action_formulas::false_ &)
void apply(const action_formulas::exists &x)
const lps::multi_action & a
void leave(const action_formulas::multi_action &x)