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