Vaucanson 1.4
|
00001 // is_ltl.hxx: this file is part of the Vaucanson project. 00002 // 00003 // Vaucanson, a generic library for finite state machines. 00004 // 00005 // Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2010 The Vaucanson Group. 00006 // 00007 // This program is free software; you can redistribute it and/or 00008 // modify it under the terms of the GNU General Public License 00009 // as published by the Free Software Foundation; either version 2 00010 // of the License, or (at your option) any later version. 00011 // 00012 // The complete GNU General Public Licence Notice can be found as the 00013 // `COPYING' file in the root directory. 00014 // 00015 // The Vaucanson Group consists of people listed in the `AUTHORS' file. 00016 // 00017 #ifndef VCSN_ALGORITHMS_IS_LTL_HXX 00018 # define VCSN_ALGORITHMS_IS_LTL_HXX 00019 00020 # include <vaucanson/algorithms/is_ltl.hh> 00021 00022 # include <vaucanson/misc/usual_macros.hh> 00023 00024 # include <vaucanson/automata/concept/automata_base.hh> 00025 # include <vaucanson/algebra/concept/freemonoid_product.hh> 00026 00027 namespace vcsn 00028 { 00029 template<typename S, typename A, typename B, typename T> 00030 bool 00031 do_is_ltl(// t must be an automaton ... 00032 const AutomataBase<S>&, 00033 // ... over a free monoid product. 00034 const algebra::FreeMonoidProduct<A, B>&, 00035 const T& t) 00036 { 00037 BENCH_TASK_SCOPED("is_ltl"); 00038 00039 // Type helper. 00040 AUTOMATON_TYPES(T); 00041 00042 for_all_const_initial_states(i, t) 00043 { 00044 series_set_elt_t l = t.get_initial(*i); 00045 if (l.supp().size() > 1) 00046 return false; 00047 // We assume that an initial transition cannot be labeled by 00048 // the empty series. In other words, l.supp().size() >= 1. 00049 assertion(l.supp().size() == 1); 00050 monoid_elt_value_t m = *l.supp().begin(); 00051 if (m.first.size() > 0 || m.second.size() > 0) 00052 return false; 00053 } 00054 00055 for_all_const_transitions(e, t) 00056 { 00057 series_set_elt_t label = t.series_of(*e); 00058 for_all_const_(series_set_elt_t::support_t, it, label.supp()) 00059 { 00060 if (((*it).first.size() != 1) || ((*it).second.size() != 1)) 00061 return false; 00062 } 00063 } 00064 00065 for_all_const_final_states(f, t) 00066 { 00067 series_set_elt_t l = t.get_final(*f); 00068 if (l.supp().size() > 1) 00069 return false; 00070 // We assume that an initial transition cannot be labeled by 00071 // the empty series. In other words, l.supp().size() >= 1. 00072 assertion(l.supp().size() == 1); 00073 monoid_elt_value_t m = *l.supp().begin(); 00074 if (m.first.size() > 0 || m.second.size() > 0) 00075 return false; 00076 } 00077 00078 return true; 00079 } 00080 00081 /*---------------. 00082 | is_ltl facades | 00083 `---------------*/ 00084 00085 template <typename S, typename A> 00086 bool 00087 is_ltl(const Element<S, A>& t) 00088 { 00089 return do_is_ltl(t.structure(), 00090 t.structure().series().monoid(), t); 00091 } 00092 00093 } // ! vcsn 00094 00095 #endif // ! VCSN_ALGORITHMS_IS_LTL_HXX