1 ///////////////////////////////////////////////////////////////////////////////
2 // This file is generated automatically using Prop (version 2.3.6),
3 // last updated on Nov 2, 1999.
4 // The original source file is "trs.ph".
5 ///////////////////////////////////////////////////////////////////////////////
7 #define PROP_TUPLE2_USED
10 ///////////////////////////////////////////////////////////////////////////////
12 // Data structure for partial evaluting a TRS
14 ///////////////////////////////////////////////////////////////////////////////
16 #ifndef term_rewrite_system_h
17 #define term_rewrite_system_h
19 #include <AD/automata/treeauto.h>
25 ///////////////////////////////////////////////////////////////////////////////
27 // Forward declarations
29 ///////////////////////////////////////////////////////////////////////////////
31 class RewritingCompiler
;
34 ///////////////////////////////////////////////////////////////////////////////
36 // This class represents a rewriting term
38 ///////////////////////////////////////////////////////////////////////////////
41 ///////////////////////////////////////////////////////////////////////////////
43 // Forward class definition for Term
45 ///////////////////////////////////////////////////////////////////////////////
46 #ifndef datatype_Term_defined
47 #define datatype_Term_defined
49 typedef a_Term
* Term
;
52 ///////////////////////////////////////////////////////////////////////////////
54 // Base class for datatype Term
56 ///////////////////////////////////////////////////////////////////////////////
57 class a_Term
: public MEM
{
60 tag_CONSterm
= 0, tag_VARterm
= 1, tag_CODEterm
= 2,
61 tag_OPAQUEterm
= 3, tag_PATterm
= 4
65 const Tag_Term tag__
; // variant tag
67 inline a_Term(Tag_Term t__
) : tag__(t__
) {}
70 inline int boxed(const a_Term
*) { return 1; }
71 inline int untag(const a_Term
* x
) { return x
->tag__
; }
72 ///////////////////////////////////////////////////////////////////////////////
74 // Class for datatype constructor Term::CONSterm
76 ///////////////////////////////////////////////////////////////////////////////
77 class Term_CONSterm
: public a_Term
{
80 TreeAutomaton::Functor _1
; Cons _2
; int _3
; Term
* _4
;
81 Term_CONSterm (TreeAutomaton::Functor x_1
, Cons x_2
, int x_3
, Term
* x_4
);
84 ///////////////////////////////////////////////////////////////////////////////
86 // Class for datatype constructor Term::VARterm
88 ///////////////////////////////////////////////////////////////////////////////
89 class Term_VARterm
: public a_Term
{
92 int _1
; Pat _2
; Exp _3
;
93 Term_VARterm (int x_1
, Pat x_2
, Exp x_3
);
96 ///////////////////////////////////////////////////////////////////////////////
98 // Class for datatype constructor Term::CODEterm
100 ///////////////////////////////////////////////////////////////////////////////
101 class Term_CODEterm
: public a_Term
{
105 Term_CODEterm (Exp x_CODEterm
);
108 ///////////////////////////////////////////////////////////////////////////////
110 // Class for datatype constructor Term::OPAQUEterm
112 ///////////////////////////////////////////////////////////////////////////////
113 class Term_OPAQUEterm
: public a_Term
{
117 Term_OPAQUEterm (Decls x_OPAQUEterm
);
120 ///////////////////////////////////////////////////////////////////////////////
122 // Class for datatype constructor Term::PATterm
124 ///////////////////////////////////////////////////////////////////////////////
125 class Term_PATterm
: public a_Term
{
129 Term_PATterm (Pat x_PATterm
);
132 ///////////////////////////////////////////////////////////////////////////////
134 // Datatype constructor functions for Term
136 ///////////////////////////////////////////////////////////////////////////////
137 extern a_Term
* CONSterm (TreeAutomaton::Functor x_1
, Cons x_2
, int x_3
, Term
* x_4
);
138 extern a_Term
* VARterm (int x_1
, Pat x_2
, Exp x_3
);
139 extern a_Term
* CODEterm (Exp x_CODEterm
);
140 extern a_Term
* OPAQUEterm (Decls x_OPAQUEterm
);
141 extern a_Term
* PATterm (Pat x_PATterm
);
148 ///////////////////////////////////////////////////////////////////////////////
150 // This class represent a term rewriting system.
152 ///////////////////////////////////////////////////////////////////////////////
154 TRS(); // no default constructor
155 TRS(const TRS
&); // no copy constructor
156 void operator = (const TRS
&); // no assignment
158 typedef TreeAutomaton::Functor Functor
;
159 typedef TreeAutomaton::State State
;
160 typedef TreeAutomaton::Rule Rule
;
161 enum EvalResult
{ SUCCESS
, FAILURE
, UNKNOWN
};
168 typedef a_List
<Residue
> *
173 ////////////////////////////////////////////////////////////////////////////
175 // Data to implement the tree automaton and the rules
177 ////////////////////////////////////////////////////////////////////////////
178 enum { MAX_VARS
= 256 };
179 RewritingCompiler
& compiler
; // the rewriting compiler
180 const FunctorMap
& Fmap
; // the functor map
181 const TreeAutomaton
& treeauto
; // the tree automata
182 int number_of_rules
; // number of rules
183 MatchRule
* rule_map
; // mapping from rule_no to rule
184 Exp
* guard_map
; // mapping from rule_no to guard
185 Term
* lhs_map
; // mapping from rule_no to lhs
186 Term
* rhs_map
; // mapping from rule_no to rhs
187 int * num_var_map
; // mapping from rule_no to number of vars
188 Exp
** var_map
; // mapping from rule_no to variable bindings
189 Pat
** var_pat_map
; // mapping from rule_no to variable patterns
190 Residues
** residue_map
; // mapping from rule_no x variable -> residue
191 Literal
* literal_map
; // mapping from functor -> literal
192 Exp
* optimized_map
; // mapping from rule_no -> optimized expr
193 int states
[MAX_VARS
]; // state table
194 int mus
[MAX_VARS
]; // mu table
195 Bool count_redex
; // count redex mode/don't normalize
197 ////////////////////////////////////////////////////////////////////////////
199 // The local variable environment.
201 ////////////////////////////////////////////////////////////////////////////
202 int num_vars
; // number of variables in environment
203 Exp vars
[MAX_VARS
]; // variable bindings
204 Pat var_pats
[MAX_VARS
]; // variable pattern names
206 ////////////////////////////////////////////////////////////////////////////
208 // Partial evaluation statistics
210 ////////////////////////////////////////////////////////////////////////////
211 int number_of_specializations
;
212 void clear_statistics();
215 TRS(RewritingCompiler
&);
218 ////////////////////////////////////////////////////////////////////////////
222 ////////////////////////////////////////////////////////////////////////////
223 void print (std::ostream
&) const;
224 void print (std::ostream
&,Term
) const;
225 void print_report(std::ostream
&) const;
226 void print_specializations(std::ostream
&) const;
228 ////////////////////////////////////////////////////////////////////////////
230 // Partial evaluation and code generation methods
232 ////////////////////////////////////////////////////////////////////////////
234 Bool
gen_replacement(CodeGen
&, Rule
, Exp
);
238 ////////////////////////////////////////////////////////////////////////////
240 // Methods to construct the term representation.
242 ////////////////////////////////////////////////////////////////////////////
243 void make_lhs(Rule r
, Pat
);
244 void make_rhs(Rule r
, Term
);
245 void make_rhs(Rule r
, Exp
);
248 Term
make_term(Pat
, Cons
, Pats
);
249 Term
* make_term(Pats
);
252 Term
make_term(Exp
, Id
, Exps
);
253 Term
* make_term(Exps
);
255 Term
make_term_var(Pat
, Exp
);
257 ////////////////////////////////////////////////////////////////////////////
259 // Methods for partial evaluation
261 ////////////////////////////////////////////////////////////////////////////
266 ////////////////////////////////////////////////////////////////////////////
268 // Methods for normalization and reduction
270 ////////////////////////////////////////////////////////////////////////////
271 State
normalize (Term
& term
, int& reductions
);
272 Bool
is_relevant(Rule
);
273 Term
reduce (Term term
, State
, int& reductions
, Bool
& changed
);
274 EvalResult
eval_guard(Exp
);
275 Term
subst (Term
, Term
, Bool
&);
276 Term
* subst (int, Term
[], Term
, Bool
&);
277 Term
proj (Exp
, Term
, Bool
&);
278 Exp
proj (Exp
, Exp
, Bool
&);
280 Term
* copy (int, Term
[]);
282 ////////////////////////////////////////////////////////////////////////////
284 // Methods for generating residue code
286 ////////////////////////////////////////////////////////////////////////////
287 void generate_residue(Rule
, int, State
, Term
);
288 Exp
make_exp(Term
) const;
289 Exps
make_exp(int n
, Term
[]) const;
291 ////////////////////////////////////////////////////////////////////////////
293 // Methods for error reporting
295 ////////////////////////////////////////////////////////////////////////////
296 void print_residue(Rule
, Term
) const;
301 ------------------------------- Statistics -------------------------------
302 Merge matching rules = yes
303 Number of DFA nodes merged = 0
304 Number of ifs generated = 0
305 Number of switches generated = 0
308 Adaptive matching = enabled
309 Fast string matching = disabled
310 Inline downcasts = enabled
311 --------------------------------------------------------------------------