12#ifndef MCRL2_PBES_UNIFY_PARAMETERS_H
13#define MCRL2_PBES_UNIFY_PARAMETERS_H
15#include "mcrl2/data/data_expression.h"
16#include "mcrl2/data/default_expression_generator.h"
17#include "mcrl2/pbes/pbes_expression.h"
18#include "mcrl2/pbes/replace.h"
19#include "mcrl2/pbes/srf_pbes.h"
20#include "mcrl2/pbes/detail/pbes_remove_counterexample_info.h"
50 std::vector<data::variable> parameter_vector;
51 for (
const auto& p: propositional_variable_parameters)
53 const data::variable_list& eqn_parameters = p.second;
54 for (
const data::variable& v: eqn_parameters)
56 auto i = parameter_positions.find(v);
57 if (i == parameter_positions.end())
59 parameter_positions[v] = parameter_vector.size();
60 parameter_vector.push_back(v);
64 return data::variable_list(parameter_vector.begin(), parameter_vector.end());
68 const std::map<core::identifier_string, data::variable_list>& propositional_variable_parameters_,
76 parameters = compute_parameters();
77 tmp_parameters.resize(parameters.size());
80 for (
const auto& p: propositional_variable_parameters_)
82 const data::variable_list& eqn_parameters = p.second;
83 auto i = missing_parameters.find(eqn_parameters);
84 if (i != missing_parameters.end())
88 std::set<data::variable> eqn_parameter_set(eqn_parameters.begin(), eqn_parameters.end());
89 std::vector<data::variable> missing;
90 for (
const data::variable& v: parameters)
92 if (!contains(eqn_parameter_set, v))
97 missing_parameters[eqn_parameters] = missing;
109 const data::variable_list& variables = propositional_variable_parameters.at(x.name());
111 auto i = variables.begin();
112 auto j = values.begin();
113 for (; i != variables.end(); ++i, ++j)
115 std::size_t pos = parameter_positions[*i];
116 tmp_parameters[pos] = *j;
119 for (
const data::variable& v: missing_parameters[variables])
121 std::size_t pos = parameter_positions[v];
125 tmp_parameters[pos] = generator(v.sort());
129 tmp_parameters[pos] = v;
133 return propositional_variable_instantiation(x.name(), data::data_expression_list(tmp_parameters.begin(), tmp_parameters.end()));
143 std::map<core::identifier_string, data::variable_list> propositional_variable_parameters;
144 for (
const pbes_equation& eqn: p.equations())
147 if (!ignore_ce_equations || !detail::is_counter_example_equation(eqn))
149 propositional_variable_parameters[eqn.variable().name()] = eqn.variable().parameters();
157 replace_propositional_variables(p, replace);
163 for (pbes_equation& eqn: p.equations())
166 if (!detail::is_counter_example_equation(eqn))
168 propositional_variable& X = eqn.variable();
169 X = propositional_variable(X.name(), replace.parameters);
175template<
bool allow_ce>
179 std::map<core::identifier_string, data::variable_list> propositional_variable_parameters;
180 for (
const auto& eqn: p.equations())
184 propositional_variable_parameters[eqn.variable().name()] = eqn.variable().parameters();
191 std::size_t N = p.equations().size();
192 const auto& false_summand = p.equations()[N - 2].summands().front();
193 const auto& true_summand = p.equations()[N - 1].summands().front();
196 for (
auto& eqn: p.equations())
201 for (
auto& summand: eqn.summands())
203 summand.variable() = replace(summand.variable());
212 for (
auto& summand: eqn.summands())
214 if (summand.variable() == false_summand.variable() || summand.variable() == true_summand.variable())
216 summand.variable() = replace_reset(summand.variable());
223 p.initial_state() = replace_reset(p.initial_state());
230 std::optional<
data::variable_list> parameters;
231 for (
const auto& equation : pbes.equations())
233 if (!parameters.has_value())
235 parameters = equation.variable().parameters();
239 if (parameters.value() != equation.variable().parameters())
Expression generator that caches values.
parameterized boolean equation system
propositional_variable_instantiation & initial_state()
Returns the initial state.
\brief A propositional variable instantiation
const data::data_expression_list & parameters() const
propositional_variable_instantiation & operator=(propositional_variable_instantiation &&) noexcept=default
\brief A propositional variable declaration
const core::identifier_string & name() const
propositional_variable & operator=(propositional_variable &&) noexcept=default
bool is_counter_example_equation(const pbes_equation &equation)
Guesses if the PBES equation is a counter example equation.
bool is_counter_example_instantiation(const propositional_variable_instantiation &inst)
Guesses if the PBES variable instantiation is for counter example equation.
bool has_unified_parameters(const pbes &pbes)
void unify_parameters(pbes &p, bool ignore_ce_equations, bool reset)
void unify_parameters(detail::pre_srf_pbes< allow_ce > &p, bool ignore_ce_equations, bool reset)
See unify_parameters(pbes&, bool, bool) for a description of the parameters.
propositional_variable_instantiation operator()(const propositional_variable_instantiation &x) const
data::default_expression_generator generator
data::variable_list compute_parameters()
std::vector< data::data_expression > tmp_parameters
data::variable_list parameters
unify_parameters_replace_function(const std::map< core::identifier_string, data::variable_list > &propositional_variable_parameters_, const data::data_specification &dataspec, bool reset)
bool m_reset
Indicates that instantiations of parameters are reset to a default value.
const std::map< core::identifier_string, data::variable_list > & propositional_variable_parameters
std::map< data::variable, std::size_t > parameter_positions