00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGORITHMS_LTL_TO_PAIR_HXX
00018 # define VCSN_ALGORITHMS_LTL_TO_PAIR_HXX
00019
00020 # include <vaucanson/algorithms/ltl_to_pair.hh>
00021 # include <vaucanson/algorithms/is_ltl.hh>
00022
00023 namespace vcsn
00024 {
00025
00026 # define MUTE_TRAITS mute_ltl_to_pair<S, T>
00027
00028 template <typename S, typename T>
00029 inline typename MUTE_TRAITS::ret_alphabet_t
00030 MUTE_TRAITS::
00031 cartesian_product(const typename MUTE_TRAITS::first_alphabet_t& A,
00032 const typename MUTE_TRAITS::second_alphabet_t& B)
00033 {
00034 ret_alphabet_t E;
00035
00036 for_all_const_(first_alphabet_t, i, A)
00037 {
00038 for_all_const_(second_alphabet_t, j, B)
00039 {
00040 E.insert(std::make_pair(*i, *j));
00041 }
00042 }
00043
00044 return E;
00045 }
00046
00047 template <typename S, typename T>
00048 inline typename MUTE_TRAITS::ret
00049 MUTE_TRAITS::
00050 make_automaton(const typename MUTE_TRAITS::ret_alphabet_t& A)
00051 {
00052 semiring_t semiring;
00053 ret_monoid_t freemonoid(A);
00054 typename ret::series_set_t series(semiring, freemonoid);
00055
00056 return ret(Automata<typename ret::series_set_t, typename ret::kind_t>(series));
00057 }
00058
00059 template <typename S, typename T>
00060 inline typename MUTE_TRAITS::ret
00061 MUTE_TRAITS::
00062 make_automaton(const Element<S, T>& A)
00063 {
00064 ret_alphabet_t E = cartesian_product(A.structure().series().monoid().
00065 first_monoid().alphabet(),
00066 A.structure().series().monoid().
00067 second_monoid().alphabet());
00068
00069 return make_automaton(E);
00070 }
00071
00072 template <typename S, typename T>
00073 inline typename MUTE_TRAITS::ret::series_set_elt_t
00074 MUTE_TRAITS::
00075 series_convert(const typename MUTE_TRAITS::ret_series_set_t& series,
00076 const typename MUTE_TRAITS::automaton_t::
00077 series_set_elt_t& ss)
00078 {
00079 typename ret::series_set_elt_t R(series);
00080
00081
00082 std::basic_string<ret_letter_t> m;
00083 if (!(*(ss.supp().begin())).first.empty())
00084 m += std::make_pair(((*(ss.supp().begin())).first)[0],
00085 ((*(ss.supp().begin())).second)[0]);
00086 R.assoc(m, ss.get(*(ss.supp().begin())));
00087
00088 return R;
00089 }
00090
00091 template <typename S, typename T>
00092 void
00093 do_ltl_to_pair(const Element<S, T>& src,
00094 typename MUTE_TRAITS::ret& res)
00095 {
00096 TIMER_SCOPED("ltl_to_pair");
00097
00098
00099 precondition(is_ltl(src));
00100
00101
00102 typedef typename MUTE_TRAITS::automaton_t automaton_t;
00103 typedef MUTE_TRAITS pair_automaton_traits_t;
00104 typedef typename pair_automaton_traits_t::ret res_t;
00105 AUTOMATON_TYPES(automaton_t);
00106 AUTOMATON_TYPES_(res_t, res_);
00107
00108
00109 std::map<hstate_t, res_hstate_t> m;
00110
00111 for_all_const_states(p, src)
00112 m[*p] = res.add_state();
00113
00114
00115 for_all_const_initial_states(i, src)
00116 {
00117 res.set_initial(m[*i],
00118 pair_automaton_traits_t::
00119 series_convert(res.structure().series(),
00120 src.get_initial(*i)));
00121 }
00122
00123
00124 for_all_const_transitions(e, src)
00125 {
00126 res.add_series_transition(m[src.src_of(*e)],
00127 m[src.dst_of(*e)],
00128 pair_automaton_traits_t::
00129 series_convert(res.structure().series(),
00130 src.series_of(*e)));
00131 }
00132
00133
00134 for_all_const_final_states(f, src)
00135 {
00136 res.set_final(m[*f],
00137 pair_automaton_traits_t::
00138 series_convert(res.structure().series(),
00139 src.get_final(*f)));
00140 }
00141 }
00142
00143
00144
00145
00146
00147 template <typename S, typename T>
00148 void
00149 ltl_to_pair(const Element<S, T>& ltl,
00150 typename MUTE_TRAITS::ret& res)
00151 {
00152 do_ltl_to_pair(ltl, res);
00153 }
00154
00155 template <typename S, typename T>
00156 typename MUTE_TRAITS::ret
00157 ltl_to_pair(const Element<S, T>& ltl)
00158 {
00159 typename MUTE_TRAITS::ret res = MUTE_TRAITS::make_automaton(ltl);
00160
00161 do_ltl_to_pair(ltl, res);
00162
00163 return res;
00164 }
00165
00166 # undef MUTE_TRAITS
00167
00168 }
00169
00170 #endif // ! VCSN_ALGORITHMS_LTL_TO_PAIR_HXX