12#ifndef MCRL2_DATA_SELECTION_H
13#define MCRL2_DATA_SELECTION_H
15#include "mcrl2/data/data_specification.h"
16#include "mcrl2/data/find.h"
17#include "mcrl2/data/fset.h"
25
26
27
28
29
30
31
32
33
34
45 m_used_symbols.insert(f);
48 template <
typename Range >
51 m_used_symbols.insert(r.begin(), r.end());
65 std::set< sort_expression > sorts(specification.sorts().begin(),specification.sorts().end());
66 for (
const sort_expression& sort: sorts)
68 add_symbols(specification.constructors(sort));
70 add_symbol(equal_to(sort));
71 add_symbol(not_equal_to(sort));
74 if (sort_fset::is_fset(sort))
76 const container_sort &s = atermpp::down_cast<container_sort>(sort);
77 add_symbol(sort_fset::insert(s.element_sort()));
82 add_symbol(if_(sort));
85 std::map< data_equation, std::set< function_symbol > > symbols_for_equation;
87 for (
const data_equation& equation: specification.equations())
89 std::set< function_symbol > used_symbols;
91 data::detail::make_find_function_symbols_traverser<data::data_expression_traverser>(std::inserter(used_symbols, used_symbols.end())).apply(equation.lhs());
92 symbols_for_equation[equation].swap(used_symbols);
96
97 std::vector<
bool> equations_of_which_symbols_have_been_added(specification.equations().size(),
false);
102 std::size_t equation_count=0;
103 for (
const data_equation& e: specification.equations())
105 if (!equations_of_which_symbols_have_been_added[equation_count] &&
106 std::includes(m_used_symbols.begin(), m_used_symbols.end(), symbols_for_equation[e].begin(), symbols_for_equation[e].end()))
108 add_function_symbols(e.rhs());
109 add_function_symbols(e.condition());
110 equations_of_which_symbols_have_been_added[equation_count]=
true;
127 return m_used_symbols.count(f)>0;
138 std::set< function_symbol > used_symbols;
140 data::detail::make_find_function_symbols_traverser<data::data_expression_traverser>(std::inserter(used_symbols, used_symbols.end())).apply(e.lhs());
142 return std::includes(m_used_symbols.begin(), m_used_symbols.end(), used_symbols.begin(), used_symbols.end());
147 data::detail::make_find_function_symbols_traverser<data::data_expression_traverser>(std::inserter(m_used_symbols, m_used_symbols.end())).apply(t);
156 template <
typename Range>
160 add_symbols(context);
165 const std::set<function_symbol>& function_symbols,
166 const std::set<data::variable>& global_variables,
167 const bool do_not_remove_function_symbols
168 ):
add_all(do_not_remove_function_symbols)
171 for (
const variable& global_variable: global_variables)
173 add_symbols(specification.constructors(global_variable.sort()));
174 add_symbols(specification.mappings(global_variable.sort()));
176 m_used_symbols.insert(function_symbols.begin(), function_symbols.end());
185
186
std::stack< std::reference_wrapper< _aterm > > m_todo
A reusable todo stack.
Generates unique function symbols with a given prefix.
std::size_t m_initial_index
Cache the value that is set in the constructor.
void clear()
Restores the index back to the value that was initially assigned in the constructor.
std::size_t m_index
A reference to the index as present in the function symbol generator.
std::string m_string_buffer
A local string cache to prevent allocating new strings for every function symbol generated.
function_symbol operator()(std::size_t arity=0)
Generates a unique function symbol with the given prefix followed by a number.
function_symbol operator()(const std::string &prefix)
Generate a unique function symbol, based on the prefix, followed by a number.
function_symbol_generator(const std::string &prefix)
Constructor.
~function_symbol_generator()
std::shared_ptr< std::size_t > m_central_index
The address of the central index for this prefix.
A unordered_map class in which aterms can be stored.
An abstraction expression.
const variable_list & variables() const
abstraction(const binder_type &binding_operator, const variable_list &variables, const data_expression &body)
Constructor.
const data_expression & body() const
const binder_type & binding_operator() const
data_expression & operator=(const data_expression &) noexcept=default
bool is_default_data_expression() const
A function to efficiently determine whether a data expression is made by the default constructor.
strategy create_a_rewriting_based_strategy(const function_symbol &f, const data_equation_list &rules1)
strategy create_a_cpp_function_based_strategy(const function_symbol &f, const data_specification &data_spec)
class rewrite_stack m_rewrite_stack
void apply_cpp_code_to_higher_order_term(data_expression &result, const application &t, std::function< void(data_expression &, const data_expression &)> rewrite_cpp_code, ITERATOR begin, ITERATOR end, substitution_type &sigma)
void rewrite_aux_const_function_symbol(data_expression &result, const function_symbol &op, substitution_type &sigma)
void thread_initialise() override
rewrite_strategy getStrategy() override
Get rewriter strategy that is used.
RewriterJitty(const data_specification &data_spec, const used_data_equation_selector &)
void rewrite_aux(data_expression &result, const data_expression &term, substitution_type &sigma)
Rewrite a term with a given substitution and put the rewritten term in result.
RewriterJitty(const RewriterJitty &other)=default
void add_normal_form_function(data_expression &t)
strategy create_strategy(const function_symbol &f, const data_equation_list &rules1, const data_specification &data_spec)
data_expression rewrite(const data_expression &term, substitution_type &sigma) override
Rewrite an mCRL2 data term.
void apply_cpp_code_to_higher_order_term(data_expression &result, const application &t, const std::function< void(data_expression &, const data_expression &)> rewrite_cpp_code, ITERATOR begin, ITERATOR end, substitution_type &sigma)
const function_symbol & this_term_is_in_normal_form()
void subst_values(data_expression &result, const jitty_assignments_for_a_rewrite_rule &assignments, const data_expression &t, data::enumerator_identifier_generator &generator)
RewriterJitty & operator=(const RewriterJitty &other)=delete
data_expression remove_normal_form_function(const data_expression &t)
atermpp::detail::thread_aterm_pool * m_thread_aterm_pool
void rebuild_strategy(const data_specification &data_spec, const mcrl2::data::used_data_equation_selector &equation_selector)
void rewrite_aux_function_symbol(data_expression &result, const function_symbol &op, const application &term, substitution_type &sigma, std::size_t do_not_rewrite_first_arguments=0)
std::vector< strategy > jitty_strat
void rewrite(data_expression &result, const data_expression &term, substitution_type &sigma) override
Rewrite an mCRL2 data term.
std::map< function_symbol, data_equation_list > jitty_eqns
bool rewriting_in_progress
void make_jitty_strat_sufficiently_larger(std::size_t i)
Auxiliary function to take care that the array jitty_strat is sufficiently large to access element i.
std::shared_ptr< detail::Rewriter > clone() override
Clone a rewriter.
function_symbol this_term_is_in_normal_form_symbol
~RewriterJitty() override
std::vector< data_expression > rhs_for_constants_cache
Rewriter interface class.
used_data_equation_selector data_equation_selector
mcrl2::data::data_specification m_data_specification_for_enumeration
virtual std::shared_ptr< detail::Rewriter > clone()=0
Clone a rewriter.
void rewrite_single_lambda(data_expression &result, const variable_list &vl, const data_expression &body, substitution_type &sigma, bool body_in_normal_form)
void rewrite_lambda_application(data_expression &result, const data_expression &t, substitution_type &sigma, bool arguments_are_in_normal_form=false)
Rewrite t, assuming that the headsymbol of t, which can be nested, is a lambda term.
void rewrite_where(data_expression &result, const where_clause &term, substitution_type &sigma)
virtual void rewrite(data_expression &result, const data_expression &term, substitution_type &sigma)=0
Rewrite an mCRL2 data term.
data_expression operator()(const data_expression &term, substitution_type &sigma)
Provide the rewriter with a () operator, such that it can also rewrite terms using this operator.
virtual ~Rewriter()=default
Destructor.
void existential_quantifier_enumeration(data_expression &result, const variable_list &vl, const data_expression &t1, substitution_type &sigma, bool t1_is_normal_form=false)
void existential_quantifier_enumeration(data_expression &result, const abstraction &t, substitution_type &sigma, bool t1_is_normal_form=false)
Rewriter(const Rewriter &other)=default
The copy constructor operator is protected. Public copying is not allowed.
void universal_quantifier_enumeration(data_expression &result, const variable_list &vl, const data_expression &t1, substitution_type &sigma, bool t1_is_normal_form=false)
virtual rewrite_strategy getStrategy()=0
Get rewriter strategy that is used.
void quantifier_enumeration(data_expression &result, const variable_list &vl, const data_expression &t1, bool t1_is_normal_form, substitution_type &sigma, const binder_type &binder, data_expression(*lazy_op)(const data_expression &, const data_expression &), const data_expression &identity_element, const data_expression &absorbing_element)
virtual data_expression rewrite(const data_expression &term, substitution_type &sigma)=0
Rewrite an mCRL2 data term.
void rewrite_lambda_application(data_expression &result, const abstraction &lambda_term, const application &t, substitution_type &sigma, bool arguments_are_in_normal_form=false)
void universal_quantifier_enumeration(data_expression &result, const abstraction &t, substitution_type &sigma, bool t1_is_normal_form=false)
data::enumerator_identifier_generator & identifier_generator()
The fresh name generator of the rewriter.
virtual void thread_initialise()
Rewriter(const data_specification &data_spec, const used_data_equation_selector &eq_selector)
Constructor. Do not use directly; use createRewriter() function instead.
Rewriter & operator=(const Rewriter &other)=default
The copy assignment operator is protected. Public copying is not allowed.
enumerator_identifier_generator m_generator
std::set< std::size_t > m_dependencies
const std::set< std::size_t > & dependencies() const
dependencies_rewrite_rule_pair(std::set< std::size_t > &dependencies, const data_equation &eq)
data_equation equation() const
mutable_indexed_substitution & m_sigma
jitty_argument_rewriter(mutable_indexed_substitution<> &sigma, RewriterJitty &r)
void operator()(data_expression &result, const data_expression &t)
A strategy is a list of rules and the number of variables that occur in it.
core::identifier_string operator()()
Generates a unique function symbol with the given prefix followed by a number.
atermpp::function_symbol_generator f
enumerator_identifier_generator(const std::string &prefix="x_")
Constructor.
core::identifier_string operator()(const std::string &prefix)
Generates a unique constant function symbol with the given prefix followed by a number.
const sort_expression & codomain() const
function_sort(const atermpp::aterm &term)
const sort_expression_list & domain() const
const sort_expression & sort() const
sort_expression & operator=(const sort_expression &) noexcept=default
Component for selecting a subset of equations that are actually used in an encompassing specification...
used_data_equation_selector(const data_specification &specification, const std::set< function_symbol > &function_symbols, const std::set< data::variable > &global_variables, const bool do_not_remove_function_symbols)
void add_symbols(Range const &r)
void add_data_specification_symbols(const data_specification &specification)
used_data_equation_selector()
default constructor
used_data_equation_selector(const data_specification &)
select all equations
void add_function_symbols(const data_expression &t)
used_data_equation_selector(data_specification const &data_spec, Range const &context)
context is a range of function symbols
void add_symbol(const function_symbol &f)
bool operator()(const data_equation &e) const
Check whether data equation relates to used symbols, and therefore is important.
bool operator()(const data::function_symbol &f) const
Check whether the symbol is used.
std::set< function_symbol > m_used_symbols
\brief A where expression
const data_expression & body() const
const assignment_expression_list & declarations() const
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
thread_aterm_pool & g_thread_term_pool()
A reference to the thread local term pool storage.
The main namespace for the aterm++ library.
static std::size_t & generator_sequence_number()
static std::mutex & function_symbol_generator_mutex()
void CheckRewriteRule(const data_equation &data_eqn)
Check that an mCRL2 data equation is a valid rewrite rule. If not, an runtime_error is thrown indicat...
std::shared_ptr< detail::Rewriter > createRewriter(const data_specification &DataSpec, const used_data_equation_selector &equations_selector, rewrite_strategy Strategy=data::rewrite_strategy::jitty)
Create a rewriter.
data_expression remove_normal_form_function(const data_expression &t)
removes auxiliary expressions this_term_is_in_normal_form from data_expressions that are being rewrit...
bool isValidRewriteRule(const data_equation &data_eqn)
Check whether or not an mCRL2 data equation is a valid rewrite rule.
static bool match_jitty(const data_expression &t, const data_expression &p, jitty_assignments_for_a_rewrite_rule &assignments, const bool term_context_guarantees_normal_form)
std::size_t getArity(const data::function_symbol &op)
std::size_t get_direct_arity(const data::function_symbol &op)
std::set< variable > bound_variables_in_substitution(const jitty_assignments_for_a_rewrite_rule &assignments)
const data_expression & get_nested_head(const data_expression &t)
Namespace for system defined sort bool_.
const basic_sort & bool_()
Constructor for sort expression Bool.
const function_symbol & and_()
Constructor for function symbol &&.
const function_symbol & or_()
Constructor for function symbol ||.
const function_symbol & not_()
Constructor for function symbol !.
bool is_application(const data_expression &t)
Returns true if the term t is an application.
bool is_where_clause(const atermpp::aterm &x)
Returns true if the term t is a where clause.
bool is_abstraction(const atermpp::aterm &x)
Returns true if the term t is an abstraction.
bool is_exists_binder(const atermpp::aterm &x)
bool is_lambda_binder(const atermpp::aterm &x)
bool is_forall(const atermpp::aterm &x)
Returns true if the term t is a universal quantification.
bool is_function_symbol(const atermpp::aterm &x)
Returns true if the term t is a function symbol.
bool is_exists(const atermpp::aterm &x)
Returns true if the term t is an existential quantification.
bool is_function_sort(const atermpp::aterm &x)
Returns true if the term t is a function sort.
bool is_machine_number(const atermpp::aterm &x)
Returns true if the term t is a machine_number.
bool is_lambda(const atermpp::aterm &x)
Returns true if the term t is a lambda abstraction.
bool is_forall_binder(const atermpp::aterm &x)
function_symbol if_(const sort_expression &s)
Constructor for function symbol if.
bool is_variable(const atermpp::aterm &x)
Returns true if the term t is a variable.
jitty_variable_assignment_for_a_rewrite_rule * assignment
jitty_assignments_for_a_rewrite_rule(jitty_variable_assignment_for_a_rewrite_rule *a)
jitty_variable_assignment_for_a_rewrite_rule(const variable &m_var, const data_expression &m_term, bool m_nf)
bool variable_is_a_normal_form
const data_expression & term