00001 #ifndef COMPMOD_H 00002 #define COMPMOD_H 00003 00004 #include <vector> 00005 #include <cstdlib> 00006 #include <iterator> 00007 #include <set> 00008 #include <map> 00009 00010 #include "parser-structs.h" 00011 #include "unify.h" 00012 00018 class compmod 00019 { 00023 enum strategy { STRATEGY_RANDOM = 1, STRATEGY_FIRST, 00024 STRATEGY_LAST }; 00025 00029 class compmod_error: public exception {}; 00030 00034 class entry 00035 { 00041 friend std::ostream &operator<<(std::ostream &os, const entry &e); 00042 00047 entry(const c_rule *r); 00048 00053 static void init(); 00054 00061 bool operator<(const entry &rhs) const; 00062 00066 const c_rule *rule; 00067 00072 mutable std::set<int> possibles; 00073 00078 static std::map<std::string, std::set<int> > all_possibles; 00079 }; 00080 00087 friend std::ostream &operator<<(std::ostream &os, const compmod &c); 00088 00094 compmod(c_rule *rule); 00095 00099 void finalise(); 00100 00106 static strategy get_strategy(const std::string &name); 00107 00112 void report_answer(const c_term *ans_head) const; 00113 00117 void deep_delete(); 00118 00124 bool extend_set(); 00125 00135 void set_pick_strategy(const std::string &s); 00136 00141 void set_ans_a_pick_strategy(const strategy &s); 00142 00147 void set_ans_b_pick_strategy(const strategy &s); 00148 00153 void set_calls_pick_strategy(const strategy &s); 00154 00160 void set_possibles_strategy(const strategy &s); 00161 00165 void set_local_ebc_percentage(size_t p); 00166 00167 private: 00168 00174 entry get_next_entry(const std::set<entry> &s, compmod::strategy pick_strategy) const; 00175 00180 entry get_next_call() const; 00181 00186 entry get_next_answer_alternative() const; 00187 00192 entry get_next_answer_bound() const; 00193 00197 void extend_by_call(); 00198 00202 void extend_by_answer_alternative(); 00203 00207 void extend_by_answer_bound(); 00208 00214 std::pair<const c_rule*, unifier*> add_to_set(c_rule *rule); 00215 00227 void extend_by_first_answer(const c_rule *rule, const con_type &answer, const unifier *mgu); 00228 00237 void change_constraint_disjunction_call(const c_rule *original, const con_type &addition); 00238 00247 void change_constraint_disjunction_answer(const c_rule *original, const con_type &addition); 00248 00256 void change_constraint_disjunction(const c_rule *original, const con_type &addition); 00257 00266 void change_constraint_conjunction_call(const c_rule *original, const con_type &addition); 00267 00276 void change_constraint_conjunction_answer(const c_rule *original, const con_type &addition); 00277 00285 void change_constraint_conjunction(const c_rule *original, const con_type &addition); 00286 00300 bool get_answer(const c_term *t, con_type &answer, unifier &mgu) const; 00301 00309 void get_calls(const c_term *t, std::vector<const c_rule*> &calls) const; 00310 00316 void fatal_error() const; 00317 00318 00323 std::set<entry> calls; 00324 00329 std::set<entry> ob_calls; 00330 00335 std::set<entry> ans_a; 00336 00341 std::set<entry> ans_b; 00342 00347 std::set<entry> ob_ans_a; 00348 00353 std::set<entry> ob_ans_b; 00354 00358 strategy calls_pick_strategy; 00359 00364 strategy ans_a_pick_strategy; 00365 00369 strategy ans_b_pick_strategy; 00370 00374 strategy possibles_strategy; 00375 00380 std::string pick_strategy; 00381 00388 size_t percent_local_extensions; 00389 00396 std::map<const c_rule*, std::pair<const c_rule*, unifier*> > answer_extension; 00397 00401 std::set<const c_rule*> used_ebc; 00402 00407 std::vector<c_rule*> all_rules; 00408 }; 00409 00410 #endif // COMPMOD_H