00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef SPOT_EMPTINESS_CHECK_HH
00023 # define SPOT_EMPTINESS_CHECK_HH
00024
00025 #include "tgba/tgba.hh"
00026 #include "misc/hash.hh"
00027 #include <stack>
00028 #include <list>
00029 #include <utility>
00030 #include <iostream>
00031
00032 namespace spot
00033 {
00034
00055 class emptiness_check
00056 {
00057 typedef std::list<const state*> state_sequence;
00058 typedef std::pair<const state*, bdd> state_proposition;
00059 typedef std::list<state_proposition> cycle_path;
00060 public:
00061 emptiness_check(const tgba* a);
00062 ~emptiness_check();
00063
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085 bool check();
00086 bool check2();
00088
00090 void counter_example();
00091
00095 std::ostream& print_result(std::ostream& os,
00096 const tgba* restrict = 0) const;
00097
00099 void print_stats(std::ostream& os) const;
00100
00101 private:
00102
00103 struct connected_component
00104 {
00105
00106 public:
00107 connected_component(int index = -1);
00108
00109 int index;
00112 bdd condition;
00113 };
00114
00115 struct connected_component_set: public connected_component
00116 {
00117 typedef Sgi::hash_set<const state*,
00118 state_ptr_hash, state_ptr_equal> set_type;
00121 set_type states;
00122
00124 bool has_state(const state* s) const;
00125 };
00126
00127 const tgba* aut_;
00128 std::stack<connected_component> root;
00129 state_sequence suffix;
00130 cycle_path period;
00131
00132 typedef Sgi::hash_map<const state*, int,
00133 state_ptr_hash, state_ptr_equal> hash_type;
00134 hash_type h;
00135
00141 const state* h_filt(const state* s) const;
00142
00148 void remove_component(const state* start_delete);
00149
00152 void accepting_path (const connected_component_set& scc,
00153 const state* start, bdd acc_to_traverse);
00154
00157 void complete_cycle(const connected_component_set& scc,
00158 const state* from, const state* to);
00159 };
00160 }
00161 #endif // SPOT_EMPTINESS_CHECK_HH