1 ///////////////////////////////////////////////////////////////////////////////
3 // Data structure for partial evaluting a TRS
5 ///////////////////////////////////////////////////////////////////////////////
7 #ifndef term_rewrite_system_h
8 #define term_rewrite_system_h
10 #include <AD/automata/treeauto.h>
15 ///////////////////////////////////////////////////////////////////////////////
17 // Forward declarations
19 ///////////////////////////////////////////////////////////////////////////////
21 class RewritingCompiler;
25 ///////////////////////////////////////////////////////////////////////////////
27 // This class represents a rewriting term
29 ///////////////////////////////////////////////////////////////////////////////
30 datatype Term : public MEM =
31 CONSterm (TreeAutomaton::Functor, Cons, int, Term [])
32 | VARterm (int, Pat, Exp)
39 ///////////////////////////////////////////////////////////////////////////////
41 // This class represent a term rewriting system.
43 ///////////////////////////////////////////////////////////////////////////////
45 TRS(); // no default constructor
46 TRS(const TRS&); // no copy constructor
47 void operator = (const TRS&); // no assignment
49 typedef TreeAutomaton::Functor Functor;
50 typedef TreeAutomaton::State State;
51 typedef TreeAutomaton::Rule Rule;
52 enum EvalResult { SUCCESS, FAILURE, UNKNOWN };
54 typedef .[State, Term] Residue;
55 typedef List<Residue> Residues;
58 ////////////////////////////////////////////////////////////////////////////
60 // Data to implement the tree automaton and the rules
62 ////////////////////////////////////////////////////////////////////////////
63 enum { MAX_VARS = 256 };
64 RewritingCompiler& compiler; // the rewriting compiler
65 const FunctorMap& Fmap; // the functor map
66 const TreeAutomaton& treeauto; // the tree automata
67 int number_of_rules; // number of rules
68 MatchRule * rule_map; // mapping from rule_no to rule
69 Exp * guard_map; // mapping from rule_no to guard
70 Term * lhs_map; // mapping from rule_no to lhs
71 Term * rhs_map; // mapping from rule_no to rhs
72 int * num_var_map; // mapping from rule_no to number of vars
73 Exp ** var_map; // mapping from rule_no to variable bindings
74 Pat ** var_pat_map; // mapping from rule_no to variable patterns
75 Residues ** residue_map; // mapping from rule_no x variable -> residue
76 Literal * literal_map; // mapping from functor -> literal
77 Exp * optimized_map; // mapping from rule_no -> optimized expr
78 int states[MAX_VARS]; // state table
79 int mus[MAX_VARS]; // mu table
80 Bool count_redex; // count redex mode/don't normalize
82 ////////////////////////////////////////////////////////////////////////////
84 // The local variable environment.
86 ////////////////////////////////////////////////////////////////////////////
87 int num_vars; // number of variables in environment
88 Exp vars[MAX_VARS]; // variable bindings
89 Pat var_pats[MAX_VARS]; // variable pattern names
91 ////////////////////////////////////////////////////////////////////////////
93 // Partial evaluation statistics
95 ////////////////////////////////////////////////////////////////////////////
96 int number_of_specializations;
97 void clear_statistics();
100 TRS(RewritingCompiler&);
103 ////////////////////////////////////////////////////////////////////////////
107 ////////////////////////////////////////////////////////////////////////////
108 void print (std::ostream&) const;
109 void print (std::ostream&,Term) const;
110 void print_report(std::ostream&) const;
111 void print_specializations(std::ostream&) const;
113 ////////////////////////////////////////////////////////////////////////////
115 // Partial evaluation and code generation methods
117 ////////////////////////////////////////////////////////////////////////////
119 Bool gen_replacement(CodeGen&, Rule, Exp);
123 ////////////////////////////////////////////////////////////////////////////
125 // Methods to construct the term representation.
127 ////////////////////////////////////////////////////////////////////////////
128 void make_lhs(Rule r, Pat);
129 void make_rhs(Rule r, Term);
130 void make_rhs(Rule r, Exp);
133 Term make_term(Pat, Cons, Pats);
134 Term * make_term(Pats);
137 Term make_term(Exp, Id, Exps);
138 Term * make_term(Exps);
140 Term make_term_var(Pat, Exp);
142 ////////////////////////////////////////////////////////////////////////////
144 // Methods for partial evaluation
146 ////////////////////////////////////////////////////////////////////////////
151 ////////////////////////////////////////////////////////////////////////////
153 // Methods for normalization and reduction
155 ////////////////////////////////////////////////////////////////////////////
156 State normalize (Term& term, int& reductions);
157 Bool is_relevant(Rule);
158 Term reduce (Term term, State, int& reductions, Bool& changed);
159 EvalResult eval_guard(Exp);
160 Term subst (Term, Term, Bool&);
161 Term* subst (int, Term[], Term, Bool&);
162 Term proj (Exp, Term, Bool&);
163 Exp proj (Exp, Exp, Bool&);
165 Term* copy (int, Term[]);
167 ////////////////////////////////////////////////////////////////////////////
169 // Methods for generating residue code
171 ////////////////////////////////////////////////////////////////////////////
172 void generate_residue(Rule, int, State, Term);
173 Exp make_exp(Term) const;
174 Exps make_exp(int n, Term []) const;
176 ////////////////////////////////////////////////////////////////////////////
178 // Methods for error reporting
180 ////////////////////////////////////////////////////////////////////////////
181 void print_residue(Rule, Term) const;