12#ifndef MCRL2_PBES_DETAIL_LPSSTATEGRAPH_ALGORITHM_H
13#define MCRL2_PBES_DETAIL_LPSSTATEGRAPH_ALGORITHM_H
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"
27 const data::variable_list& process_parameters,
28 std::vector<lps::action_summand>& summands
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())
51 for (
const data::variable& v: lps::find_free_variables(summand.multi_action()))
53 action_variable_sorts.insert(v.sort());
56 std::map<data::sort_expression, data::function_symbol> functions;
57 for (
const data::sort_expression& s: action_variable_sorts)
59 data::function_symbol f(used, data::function_sort({ s }, data::sort_bool::bool_()));
61 dataspec.add_mapping(f);
65 core::identifier_string X(
"X");
68 std::vector<pbes_expression> conjuncts;
69 for (
const lps::action_summand& summand: lpsspec.process().action_summands())
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());
75 data::data_expression x = ci;
76 for (
const data::variable& v: lps::find_free_variables(summand.multi_action()))
78 x = data::and_(x, data::application(functions[v.sort()], v ));
80 propositional_variable_instantiation Xi(X, gi);
81 conjuncts.push_back(pbes_system::optimized_forall(ei, imp(atermpp::down_cast<pbes_expression>(x), Xi)));
83 for (
const lps::deadlock_summand& summand: lpsspec.process().deadlock_summands())
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)));
96 pbesspec.data() = dataspec;
98 pbesspec.equations().push_back(eqn);
105 mCRL2log(log::log_level_t::debug) <<
"=== resetting variables to the original LPS ---" << std::endl;
108 lps_reset_variables(*
this, eqn.formula(), eqn, lpsspec.process().process_parameters(), lpsspec.process().action_summands());
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");
132 return m_transformed_lps;
139 std::vector<data::assignment> result;
142 for (; di != d.end(); ++di, ++ei)
146 result.emplace_back(*di, *ei);
149 return data::assignment_list(result.begin(), result.end());
167 const data::variable_list& process_parameters_,
168 std::vector<lps::action_summand>& summands_
175 data::data_expression_list g_i = algorithm.reset_variable_parameters(x, eq_X, i);
176 if (i < summands.size())
178 summands[i].assignments() = make_assignments(process_parameters, g_i);
188 const data::variable_list& process_parameters,
189 std::vector<lps::action_summand>& summands
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)
void compute_occurring_data_parameters()
const lps::specification & result() const
void reset_variables_to_original(lps::specification &lpsspec)
lpsstategraph_algorithm(const lps::specification &lpsspec, const pbesstategraph_options &options)
const lps::specification & original_lps() const
void execute_postprocessing() override
pbes construct_stategraph_pbes(const lps::specification &lpsspec)
lps::specification m_transformed_lps
const lps::specification & m_original_lps
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
propositional_variable_instantiation & initial_state()
Returns the initial state.
\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.
The main namespace for the LPS library.
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)
const data::variable_list & process_parameters
const stategraph_equation & eq_X
lps_reset_traverser(lpsstategraph_algorithm &algorithm_, const stategraph_equation &eq_X_, const data::variable_list &process_parameters_, std::vector< lps::action_summand > &summands_)
std::vector< lps::action_summand > & summands
void leave(const pbes_system::propositional_variable_instantiation &x)
lpsstategraph_algorithm & algorithm