mCRL2
Loading...
Searching...
No Matches
lps2pbes_sat.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//
11
12#ifndef MCRL2_PBES_DETAIL_LPS2PBES_SAT_H
13#define MCRL2_PBES_DETAIL_LPS2PBES_SAT_H
14
19
20namespace mcrl2 {
21
22namespace pbes_system {
23
24namespace detail {
25
26template <typename TermTraits>
27typename TermTraits::term_type Sat(const lps::multi_action& a,
28 const action_formulas::action_formula& x,
29 data::set_identifier_generator& id_generator,
30 TermTraits tr
31 );
32
33template <typename Derived, typename TermTraits>
35{
37 typedef TermTraits tr;
38 typedef typename tr::term_type expression_type;
39
40 using super::enter;
41 using super::leave;
42 using super::apply;
43
46 std::vector<expression_type> result_stack;
47
48 sat_traverser(const lps::multi_action& a_, data::set_identifier_generator& id_generator_, TermTraits)
49 : a(a_), id_generator(id_generator_)
50 {}
51
52 Derived& derived()
53 {
54 return static_cast<Derived&>(*this);
55 }
56
57 void push(const expression_type& x)
58 {
59 result_stack.push_back(x);
60 }
61
62 const expression_type& top() const
63 {
64 return result_stack.back();
65 }
66
68 {
69 expression_type result = top();
70 result_stack.pop_back();
71 return result;
72 }
73
75 {
76 push(x);
77 }
78
80 {
82 }
83
85 {
86 push(true_());
87 }
88
90 {
91 push(false_());
92 }
93
95 {
96 push(tr::not_(Sat(a, x.operand(), id_generator, TermTraits())));
97 }
98
100 {
101 expression_type right = pop();
102 expression_type left = pop();
103 push(tr::and_(left, right));
104 }
105
107 {
108 expression_type right = pop();
109 expression_type left = pop();
110 push(tr::or_(left, right));
111 }
112
114 {
115 expression_type right = pop();
116 expression_type left = pop();
117 push(tr::imp(left, right));
118 }
119
121 {
123 const action_formulas::action_formula& alpha = x.body();
125
126 pbes_expression result;
127 tr::make_forall(result, y, Sat(a, action_formulas::replace_variables_capture_avoiding(alpha, sigma_x), id_generator, TermTraits()));
128 push(result);
129 }
130
132 {
134 const action_formulas::action_formula& alpha = x.body();
136
137 pbes_expression result;
138 tr::make_exists(result, y, Sat(a, action_formulas::replace_variables_capture_avoiding(alpha, sigma_x), id_generator, TermTraits()));
139 push(result);
140 }
141
143 {
145 const action_formulas::action_formula& alpha = x.operand();
146 const data::data_expression& u = x.time_stamp();
147 push(tr::and_(Sat(a, alpha, id_generator, TermTraits()), data::equal_to(t, u)));
148 }
149};
150
151template <template <class, class> class Traverser, typename TermTraits>
152struct apply_sat_traverser: public Traverser<apply_sat_traverser<Traverser, TermTraits>, TermTraits>
153{
154 typedef Traverser<apply_sat_traverser<Traverser, TermTraits>, TermTraits> super;
155 using super::enter;
156 using super::leave;
157 using super::apply;
158 using super::top;
159
161 : super(a, id_generator, tr)
162 {}
163};
164
165template <typename TermTraits>
166typename TermTraits::term_type Sat(const lps::multi_action& a,
168 data::set_identifier_generator& id_generator,
169 TermTraits tr
170 )
171{
173 f.apply(x);
174 return f.top();
175}
176
177} // namespace detail
178
179} // namespace pbes_system
180
181} // namespace mcrl2
182
183#endif // MCRL2_PBES_DETAIL_LPS2PBES_SAT_H
\brief The and operator for action formulas
\brief The at operator for action formulas
const data::data_expression & time_stamp() const
const action_formula & operand() const
\brief The existential quantification operator for action formulas
const data::variable_list & variables() const
const action_formula & body() const
\brief The value false for action formulas
\brief The universal quantification operator for action formulas
const action_formula & body() const
const data::variable_list & variables() const
\brief The implication operator for action formulas
\brief The multi action for action formulas
const process::action_list & actions() const
\brief The not operator for action formulas
const action_formula & operand() const
\brief The or operator for action formulas
\brief The value true for action formulas
Generic substitution function. The substitution is stored as a mapping of variables to expressions....
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
add your file description here.
Add your file description here.
add your file description here.
add your file description here.
void replace_variables_capture_avoiding(T &x, Substitution &sigma, data::set_identifier_generator &id_generator, typename std::enable_if<!std::is_base_of< atermpp::aterm, T >::value >::type *=nullptr)
function_symbol equal_to(const sort_expression &s)
Constructor for function symbol ==.
Definition standard.h:126
void replace_variables(T &x, const Substitution &sigma, typename std::enable_if<!std::is_base_of< atermpp::aterm, T >::value >::type *=nullptr)
Definition replace.h:213
data::data_expression equal_multi_actions(const multi_action &a, const multi_action &b)
Returns a data expression that expresses under which conditions the multi actions a and b are equal....
data::mutable_map_substitution make_fresh_variable_substitution(const data::variable_list &variables, data::set_identifier_generator &id_generator, bool add_to_context=true)
Generates a substitution that assigns fresh variables to the given sequence of variables....
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_()
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
Definition indexed_set.h:72
apply_sat_traverser(const lps::multi_action &a, data::set_identifier_generator &id_generator, TermTraits tr)
Traverser< apply_sat_traverser< Traverser, TermTraits >, TermTraits > super
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_ &)
action_formulas::action_formula_traverser< Derived > super
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)
void leave(const action_formulas::multi_action &x)