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
00066 bool check();
00067
00069 void counter_example();
00070
00071 std::ostream& print_result(std::ostream& os,
00072 const tgba* restrict = 0) const;
00073
00074 private:
00075
00076 struct connected_component
00077 {
00078
00079 public:
00080 connected_component(int index = -1);
00081
00082 int index;
00085 bdd condition;
00086 };
00087
00088 struct connected_component_set: public connected_component
00089 {
00090 typedef Sgi::hash_set<const state*,
00091 state_ptr_hash, state_ptr_equal> set_type;
00094 set_type states;
00095
00097 bool has_state(const state* s) const;
00098 };
00099
00100 const tgba* aut_;
00101 std::stack<connected_component> root;
00102 state_sequence suffix;
00103 cycle_path period;
00104
00105 typedef Sgi::hash_map<const state*, int,
00106 state_ptr_hash, state_ptr_equal> hash_type;
00107 hash_type h;
00108
00114 const state* h_filt(const state* s) const;
00115
00121 void remove_component(const state* start_delete);
00122
00125 void accepting_path (const connected_component_set& scc,
00126 const state* start, bdd acc_to_traverse);
00127
00130 void complete_cycle(const connected_component_set& scc,
00131 const state* from, const state* to);
00132 };
00133 }
00134 #endif // SPOT_EMPTINESS_CHECK_HH