00001 // Copyright (C) 2004, 2005 Laboratoire d'Informatique de Paris 6 (LIP6), 00002 // département Systèmes Répartis Coopératifs (SRC), Université Pierre 00003 // et Marie Curie. 00004 // 00005 // This file is part of Spot, a model checking library. 00006 // 00007 // Spot is free software; you can redistribute it and/or modify it 00008 // under the terms of the GNU General Public License as published by 00009 // the Free Software Foundation; either version 2 of the License, or 00010 // (at your option) any later version. 00011 // 00012 // Spot is distributed in the hope that it will be useful, but WITHOUT 00013 // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 00014 // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public 00015 // License for more details. 00016 // 00017 // You should have received a copy of the GNU General Public License 00018 // along with Spot; see the file COPYING. If not, write to the Free 00019 // Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 00020 // 02111-1307, USA. 00021 00022 #ifndef SPOT_TGBAALGOS_EMPTINESS_HH 00023 # define SPOT_TGBAALGOS_EMPTINESS_HH 00024 00025 #include <list> 00026 #include <iosfwd> 00027 #include <bdd.h> 00028 #include "tgba/state.hh" 00029 00030 namespace spot 00031 { 00032 class tgba; 00033 struct tgba_run; 00034 00067 00073 class emptiness_check_result 00074 { 00075 public: 00076 emptiness_check_result(const tgba* a) 00077 : a_(a) 00078 { 00079 } 00080 00093 virtual tgba_run* accepting_run(); 00094 00096 const tgba* 00097 automaton() const 00098 { 00099 return a_; 00100 } 00101 protected: 00102 const tgba* a_; 00103 }; 00104 00106 class emptiness_check 00107 { 00108 public: 00109 emptiness_check(const tgba* a) 00110 : a_(a) 00111 { 00112 } 00113 virtual ~emptiness_check(); 00114 00116 const tgba* 00117 automaton() const 00118 { 00119 return a_; 00120 } 00121 00132 virtual emptiness_check_result* check() = 0; 00133 00135 virtual std::ostream& print_stats(std::ostream& os) const; 00136 00137 protected: 00138 const tgba* a_; 00139 }; 00140 00142 00145 00146 00150 00152 struct tgba_run 00153 { 00154 struct step { 00155 const state* s; 00156 bdd label; 00157 bdd acc; 00158 }; 00159 00160 typedef std::list<step> steps; 00161 00162 steps prefix; 00163 steps cycle; 00164 00165 ~tgba_run(); 00166 tgba_run() 00167 { 00168 }; 00169 tgba_run(const tgba_run& run); 00170 tgba_run& operator=(const tgba_run& run); 00171 }; 00172 00188 std::ostream& print_tgba_run(std::ostream& os, 00189 const tgba* a, 00190 const tgba_run* run); 00191 00196 tgba* tgba_run_to_tgba(const tgba* a, const tgba_run* run); 00197 00199 00202 } 00203 00204 #endif // SPOT_TGBAALGOS_EMPTINESS_HH