mCRL2
Loading...
Searching...
No Matches
lpsstategraph_algorithm.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/lpsstategraph_algorithm.h
10/// \brief add your file description here.
11
12#ifndef MCRL2_PBES_DETAIL_LPSSTATEGRAPH_ALGORITHM_H
13#define MCRL2_PBES_DETAIL_LPSSTATEGRAPH_ALGORITHM_H
14
15#include "mcrl2/lps/detail/instantiate_global_variables.h"
16#include "mcrl2/lps/io.h"
17#include "mcrl2/lps/is_well_typed.h"
18#include "mcrl2/pbes/detail/stategraph_global_reset_variables.h"
19#include "mcrl2/pbes/detail/stategraph_local_reset_variables.h"
20
21namespace mcrl2::pbes_system::detail {
22
25 const pbes_expression& x,
26 const stategraph_equation& eq_X,
27 const data::variable_list& process_parameters,
28 std::vector<lps::action_summand>& summands
29);
30
32{
33 protected:
34 friend struct lps_reset_traverser;
36
38 lps::specification m_transformed_lps; // will contain the result of the computation
39
41 {
42 pbes pbesspec;
43 data::data_specification dataspec = lpsspec.data();
44
45 // create 'used' functions for every sort in the free variables of actions
47 core::identifier_string used = generator("used");
48 std::set<data::sort_expression> action_variable_sorts;
49 for (const lps::action_summand& summand: lpsspec.process().action_summands())
50 {
51 for (const data::variable& v: lps::find_free_variables(summand.multi_action()))
52 {
53 action_variable_sorts.insert(v.sort());
54 }
55 }
56 std::map<data::sort_expression, data::function_symbol> functions;
57 for (const data::sort_expression& s: action_variable_sorts)
58 {
59 data::function_symbol f(used, data::function_sort({ s }, data::sort_bool::bool_()));
60 functions[s] = f;
61 dataspec.add_mapping(f);
62 }
63
64 // the PBES variable
65 core::identifier_string X("X");
66
67 // create a PBES equation that contains a conjunct for each action summand
68 std::vector<pbes_expression> conjuncts;
69 for (const lps::action_summand& summand: lpsspec.process().action_summands())
70 {
71 const auto& ei = summand.summation_variables();
72 const auto& ci = summand.condition();
73 data::data_expression_list gi = summand.next_state(lpsspec.process().process_parameters());
74
75 data::data_expression x = ci;
76 for (const data::variable& v: lps::find_free_variables(summand.multi_action()))
77 {
78 x = data::and_(x, data::application(functions[v.sort()], v ));
79 }
80 propositional_variable_instantiation Xi(X, gi);
81 conjuncts.push_back(pbes_system::optimized_forall(ei, imp(atermpp::down_cast<pbes_expression>(x), Xi)));
82 }
83 for (const lps::deadlock_summand& summand: lpsspec.process().deadlock_summands())
84 {
85 const auto& ei = summand.summation_variables();
86 const auto& ci = summand.condition();
87 data::data_expression_list gi = data::make_data_expression_list(lpsspec.process().process_parameters());
88 propositional_variable_instantiation Xi(X, gi);
89 conjuncts.push_back(pbes_system::optimized_forall(ei, imp(atermpp::down_cast<pbes_expression>(ci), Xi)));
90 }
91
92 // N.B. It is essential that the order in which the conjuncts are traversed in a PBES matches the order of the corresponding summands.
93 pbes_expression rhs = join_and(conjuncts.begin(), conjuncts.end());
94 pbes_equation eqn(fixpoint_symbol::nu(), propositional_variable(X, lpsspec.process().process_parameters()), rhs);
95
96 pbesspec.data() = dataspec;
97 pbesspec.initial_state() = propositional_variable_instantiation(X, lpsspec.initial_process().expressions());
98 pbesspec.equations().push_back(eqn);
99 return pbesspec;
100 }
101
102 // Applies resetting of variables to the original PBES p.
104 {
105 mCRL2log(log::log_level_t::debug) << "=== resetting variables to the original LPS ---" << std::endl;
106
107 stategraph_equation& eqn = m_pbes.equations().front();
108 lps_reset_variables(*this, eqn.formula(), eqn, lpsspec.process().process_parameters(), lpsspec.process().action_summands());
109 }
110
111 public:
114 {}
115
117 {
118 m_transformed_lps = m_original_lps;
120 start_timer("reset_variables_to_original");
121 reset_variables_to_original(m_transformed_lps);
122 finish_timer("reset_variables_to_original");
123 }
124
126 {
127 return m_original_lps;
128 }
129
130 const lps::specification& result() const
131 {
132 return m_transformed_lps;
133 }
134};
135
136inline
137data::assignment_list make_assignments(const data::variable_list& d, const data::data_expression_list& e)
138{
139 std::vector<data::assignment> result;
140 auto di = d.begin();
141 auto ei = e.begin();
142 for (; di != d.end(); ++di, ++ei)
143 {
144 if (*di != *ei)
145 {
146 result.emplace_back(*di, *ei);
147 }
148 }
149 return data::assignment_list(result.begin(), result.end());
150}
151
153{
155 using super::enter;
156 using super::leave;
157 using super::apply;
158
161 const data::variable_list& process_parameters;
163 std::size_t i = 0; // the index of a summand
164
166 const stategraph_equation& eq_X_,
167 const data::variable_list& process_parameters_,
168 std::vector<lps::action_summand>& summands_
169 )
170 : algorithm(algorithm_), eq_X(eq_X_), process_parameters(process_parameters_), summands(summands_)
171 {}
172
174 {
175 data::data_expression_list g_i = algorithm.reset_variable_parameters(x, eq_X, i);
176 if (i < summands.size())
177 {
178 summands[i].assignments() = make_assignments(process_parameters, g_i);
179 i++;
180 }
181 }
182};
183
184inline
186 const pbes_expression& x,
187 const stategraph_equation& eq_X,
188 const data::variable_list& process_parameters,
189 std::vector<lps::action_summand>& summands
190 )
191{
192 lps_reset_traverser f(algorithm, eq_X, process_parameters, summands);
193 f.apply(x);
194}
195
196} // namespace mcrl2::pbes_system::detail
197
198#endif // MCRL2_PBES_DETAIL_LPSSTATEGRAPH_ALGORITHM_H
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
Linear process specification.
Adds the reset variables procedure to the stategraph algorithm.
local_reset_variables_algorithm(const pbes &p, const pbesstategraph_options &options)
lpsstategraph_algorithm(const lps::specification &lpsspec, const pbesstategraph_options &options)
pbes construct_stategraph_pbes(const lps::specification &lpsspec)
static fixpoint_symbol nu()
Returns the nu symbol.
pbes_equation(const fixpoint_symbol &symbol, const propositional_variable &variable, const pbes_expression &expr)
Constructor.
parameterized boolean equation system
Definition pbes.h:54
propositional_variable_instantiation & initial_state()
Returns the initial state.
Definition pbes.h:194
\brief A propositional variable instantiation
propositional_variable_instantiation & operator=(propositional_variable_instantiation &&) noexcept=default
\brief A propositional variable declaration
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
Definition logger.h:435
The main namespace for the LPS library.
Definition constelm.h:18
data::assignment_list make_assignments(const data::variable_list &d, const data::data_expression_list &e)
void lps_reset_variables(lpsstategraph_algorithm &algorithm, const pbes_expression &x, const stategraph_equation &eq_X, const data::variable_list &process_parameters, std::vector< lps::action_summand > &summands)
lps_reset_traverser(lpsstategraph_algorithm &algorithm_, const stategraph_equation &eq_X_, const data::variable_list &process_parameters_, std::vector< lps::action_summand > &summands_)
void leave(const pbes_system::propositional_variable_instantiation &x)