mCRL2
Loading...
Searching...
No Matches
jitty.h
Go to the documentation of this file.
1// Author(s): Muck van Weerdenburg
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
10#ifndef MCRL2_DATA_DETAIL_REWRITE_JITTY_H
11#define MCRL2_DATA_DETAIL_REWRITE_JITTY_H
12
13#include "mcrl2/data/detail/rewrite.h"
14#include "mcrl2/data/detail/rewrite/rewrite_stack.h"
15#include "mcrl2/data/detail/rewrite/strategy_rule.h"
16
17
18
19namespace mcrl2::data::detail
20{
21
23{
24 const variable& var;
27
29 : var(m_var),
30 term(m_term),
32 {}
33};
34
36{
39
41 : assignment(a)
42 {}
43
44};
45
47{
48 public:
50
52
54
55 // The copy constructor.
56 RewriterJitty(const RewriterJitty& other) = default;
57
58 // The assignment operator.
59 RewriterJitty& operator=(const RewriterJitty& other) = delete;
60
61 ~RewriterJitty() override;
62
63 rewrite_strategy getStrategy() override;
64
65 data_expression rewrite(const data_expression& term, substitution_type& sigma) override;
66
67 void rewrite(data_expression& result, const data_expression& term, substitution_type& sigma) override;
68
69 std::shared_ptr<detail::Rewriter> clone() override { return std::shared_ptr<Rewriter>(new RewriterJitty(*this)); }
70
72 {
74 }
75
76 protected:
77
78 // A dedicated function symbol that indicates that a term is in normal form. It has name "Rewritten@@term".
79 // The function symbol below is used to administrate that a term is in normal form. It is put around a term.
80 // Terms with this auxiliary function symbol cannot be printed using the pretty printer for data expressions.
83
84 class rewrite_stack m_rewrite_stack; // Stack for intermediate rewrite results.
85
86 std::vector<data_expression> rhs_for_constants_cache; // Cache that contains normal forms for constants.
89
91 = nullptr; // Store an explicit reference to the thread aterm pool.
92
93 template<class ITERATOR>
95 const application& t,
96 std::function<void(data_expression&, const data_expression&)> rewrite_cpp_code,
97 ITERATOR begin,
98 ITERATOR end,
99 substitution_type& sigma);
100
101 void rewrite_aux(data_expression& result, const data_expression& term, substitution_type& sigma);
102
104 const function_symbol& op,
105 const application& term,
106 substitution_type& sigma,
107 std::size_t do_not_rewrite_first_arguments = 0);
108
110 data_expression& result,
111 const function_symbol& op,
112 substitution_type& sigma);
113
114 /// \brief Auxiliary function to take care that the array jitty_strat is sufficiently large
115 /// to access element i.
116 void make_jitty_strat_sufficiently_larger(std::size_t i);
117
119 strategy create_a_rewriting_based_strategy(const function_symbol& f, const data_equation_list& rules1);
120 strategy create_strategy(const function_symbol& f, const data_equation_list& rules1, const data_specification& data_spec);
121 void rebuild_strategy(const data_specification& data_spec, const mcrl2::data::used_data_equation_selector& equation_selector);
122
125 void subst_values(
126 data_expression& result,
127 const jitty_assignments_for_a_rewrite_rule& assignments,
128 const data_expression& t,
130
132};
133
134/// \brief removes auxiliary expressions this_term_is_in_normal_form from data_expressions that are being rewritten.
135/// \details The function below is intended to remove the auxiliary function this_term_is_in_normal_form from a term
136/// such that it can for instance be pretty printed. This auxiliary function is used internally in terms
137/// when rewriting to avoid to rewrite too often.
139
140} // namespace mcrl2::data::detail
141
142
143
144#endif
std::stack< std::reference_wrapper< _aterm > > m_todo
A reusable todo stack.
A unordered_map class in which aterms can be stored.
An abstraction expression.
Definition abstraction.h:23
const variable_list & variables() const
Definition abstraction.h:60
abstraction(const binder_type &binding_operator, const variable_list &variables, const data_expression &body)
Constructor.
Definition abstraction.h:39
const data_expression & body() const
Definition abstraction.h:65
const binder_type & binding_operator() const
Definition abstraction.h:55
\brief A data equation
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)
Definition strategy.cpp:44
strategy create_a_cpp_function_based_strategy(const function_symbol &f, const data_specification &data_spec)
Definition strategy.cpp:220
class rewrite_stack m_rewrite_stack
Definition jitty.h:84
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)
Definition jitty.cpp:803
void thread_initialise() override
Definition jitty.h:131
rewrite_strategy getStrategy() override
Get rewriter strategy that is used.
Definition jitty.cpp:925
RewriterJitty(const data_specification &data_spec, const used_data_equation_selector &)
Definition jitty.cpp:169
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.
Definition jitty.cpp:446
RewriterJitty(const RewriterJitty &other)=default
void add_normal_form_function(data_expression &t)
Definition jitty.cpp:92
strategy create_strategy(const function_symbol &f, const data_equation_list &rules1, const data_specification &data_spec)
Definition strategy.cpp:240
data_expression rewrite(const data_expression &term, substitution_type &sigma) override
Rewrite an mCRL2 data term.
Definition jitty.cpp:915
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)
Definition jitty.cpp:417
const function_symbol & this_term_is_in_normal_form()
Definition jitty.h:71
void subst_values(data_expression &result, const jitty_assignments_for_a_rewrite_rule &assignments, const data_expression &t, data::enumerator_identifier_generator &generator)
Definition jitty.cpp:224
RewriterJitty & operator=(const RewriterJitty &other)=delete
data_expression remove_normal_form_function(const data_expression &t)
Definition jitty.cpp:36
atermpp::detail::thread_aterm_pool * m_thread_aterm_pool
Definition jitty.h:91
void rebuild_strategy(const data_specification &data_spec, const mcrl2::data::used_data_equation_selector &equation_selector)
Definition jitty.cpp:147
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)
Definition jitty.cpp:583
std::vector< strategy > jitty_strat
Definition jitty.h:88
void rewrite(data_expression &result, const data_expression &term, substitution_type &sigma) override
Rewrite an mCRL2 data term.
Definition jitty.cpp:878
std::map< function_symbol, data_equation_list > jitty_eqns
Definition jitty.h:87
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.
Definition jitty.cpp:139
std::shared_ptr< detail::Rewriter > clone() override
Clone a rewriter.
Definition jitty.h:69
function_symbol this_term_is_in_normal_form_symbol
Definition jitty.h:81
std::vector< data_expression > rhs_for_constants_cache
Definition jitty.h:86
Rewriter interface class.
Definition rewrite.h:39
Rewriter(const data_specification &data_spec, const used_data_equation_selector &eq_selector)
Constructor. Do not use directly; use createRewriter() function instead.
Definition rewrite.h:60
const std::set< std::size_t > & dependencies() const
Definition jitty.cpp:124
dependencies_rewrite_rule_pair(std::set< std::size_t > &dependencies, const data_equation &eq)
Definition jitty.cpp:120
mutable_indexed_substitution & m_sigma
Definition jitty.cpp:100
jitty_argument_rewriter(mutable_indexed_substitution<> &sigma, RewriterJitty &r)
Definition jitty.cpp:103
void operator()(data_expression &result, const data_expression &t)
Definition jitty.cpp:107
A strategy is a list of rules and the number of variables that occur in it.
\brief A function sort
const sort_expression & codomain() const
\brief A function symbol
const sort_expression & sort() const
\brief A sort expression
Component for selecting a subset of equations that are actually used in an encompassing specification...
Definition selection.h:36
\brief A data variable
Definition variable.h:25
\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.
Definition logger.h:435
thread_aterm_pool & g_thread_term_pool()
A reference to the thread local term pool storage.
The main namespace for the aterm++ library.
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...
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)
Definition jitty.cpp:346
std::set< variable > bound_variables_in_substitution(const jitty_assignments_for_a_rewrite_rule &assignments)
Definition jitty.cpp:212
const data_expression & get_nested_head(const data_expression &t)
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)
bool is_variable(const atermpp::aterm &x)
Returns true if the term t is a variable.
jitty_variable_assignment_for_a_rewrite_rule * assignment
Definition jitty.h:38
jitty_assignments_for_a_rewrite_rule(jitty_variable_assignment_for_a_rewrite_rule *a)
Definition jitty.h:40
jitty_variable_assignment_for_a_rewrite_rule(const variable &m_var, const data_expression &m_term, bool m_nf)
Definition jitty.h:28