Vaucanson 1.4
|
00001 // transducer.hh: 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 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_AUTOMATA_CONCEPT_TRANSDUCER_HH 00018 # define VCSN_AUTOMATA_CONCEPT_TRANSDUCER_HH 00019 00020 # include <vaucanson/design_pattern/design_pattern.hh> 00021 # include <vaucanson/automata/concept/automata.hh> 00022 # include <vaucanson/automata/concept/automata_base.hh> 00023 # include <vaucanson/automata/concept/transducer_base.hh> 00024 00025 namespace vcsn { 00026 00027 template <typename Series, typename Kind> 00028 // FIXME: Rename to TransducerSet (see Trac #3) 00029 struct Transducer; 00030 00032 template <typename Series, typename Kind> 00033 struct dynamic_traits<Transducer<Series, Kind> > 00034 : dynamic_traits<TransducerBase<Series> > 00035 { 00036 static const bool ret = dynamic_traits<Series>::ret; 00037 }; 00038 00040 template <typename Series, typename Kind, typename T> 00041 struct MetaElement<Transducer<Series, Kind>, T> 00042 : MetaElement<TransducerBase<Transducer<Series, Kind> >, T> 00043 {}; 00044 00046 template <typename Series, typename Kind> 00047 struct virtual_types<Transducer<Series, Kind> > 00048 { 00049 typedef Series series_set_t; 00050 typedef Kind kind_t; 00051 }; 00052 00054 template <typename Series, typename Kind> 00055 class Transducer 00056 : public TransducerBase<Transducer<Series, Kind> >, 00057 private SetSlot<Series> 00058 { 00059 public: 00060 typedef Transducer<Series, Kind> self_t; 00061 typedef typename virtual_types<self_t>::series_set_t series_set_t; 00062 typedef typename virtual_types<self_t>::kind_t kind_t; 00063 00064 Transducer(const series_set_t&); 00065 00066 const series_set_t& series() const; 00067 00068 }; 00069 00070 00071 /*------------------------. 00072 | INPUT PROJECTION TRAITS | 00073 `------------------------*/ 00074 00075 template <typename S, typename T> 00076 struct input_projection_helper 00077 { }; 00078 00079 template <typename S, typename K, typename T> 00080 struct input_projection_helper<Transducer<S, K>, T> 00081 { 00082 typedef Transducer<S, K> structure_t; 00083 00084 typedef Element<structure_t, T> automaton_t; 00085 00086 typedef typename structure_t::series_set_t::semiring_t 00087 typeof_auto_series_set_t; 00088 00089 typedef typename structure_t::series_set_t::monoid_t auto_monoid_t; 00090 00091 typedef typename typeof_auto_series_set_t::semiring_t auto_semiring_t; 00092 typedef typename algebra::mute_series_traits<typeof_auto_series_set_t, 00093 auto_semiring_t, 00094 auto_monoid_t>::ret 00095 auto_series_set_t; 00096 00097 typedef typename input_projection_traits<T>::ret auto_impl_t; 00098 typedef Element<Automata<auto_series_set_t, K>, auto_impl_t> ret; 00099 00100 static ret make_input_projection_automaton(const automaton_t& t); 00101 }; 00102 00103 template <typename S, typename K, typename T> 00104 struct input_projection_helper<Automata<S, K>, T> 00105 { 00106 typedef Automata<S, K> structure_t; 00107 00108 typedef Element<structure_t, T> automaton_t; 00109 00110 typedef typename structure_t::series_set_t typeof_auto_series_set_t; 00111 00112 typedef typename structure_t::series_set_t::semiring_t auto_semiring_t; 00113 00114 typedef typename structure_t::series_set_t::monoid_t::first_monoid_t 00115 auto_monoid_t; 00116 00117 typedef typename algebra::mute_series_traits<typeof_auto_series_set_t, 00118 auto_semiring_t, 00119 auto_monoid_t>::ret 00120 auto_series_set_t; 00121 00122 typedef typename fmp_input_projection_traits<T>::ret auto_impl_t; 00123 typedef Element<Automata<auto_series_set_t, K>, auto_impl_t> ret; 00124 00125 static ret make_input_projection_automaton(const automaton_t& t); 00126 }; 00127 00128 /*-------------------------. 00129 | OUTPUT PROJECTION TRAITS | 00130 `-------------------------*/ 00131 00132 template <typename S, typename T> 00133 struct output_projection_helper 00134 { }; 00135 00136 // RW transducers 00137 template <typename S, typename K, typename T> 00138 struct output_projection_helper<Transducer<S, K>, T> 00139 { 00140 typedef Transducer<S, K> structure_t; 00141 00142 typedef Element<structure_t, T> automaton_t; 00143 00144 typedef typename structure_t::series_set_t::semiring_t 00145 typeof_auto_series_set_t; 00146 00147 typedef typename structure_t::series_set_t::semiring_t::monoid_t 00148 auto_monoid_t; 00149 00150 typedef typename typeof_auto_series_set_t::semiring_t auto_semiring_t; 00151 typedef typename algebra::mute_series_traits<typeof_auto_series_set_t, 00152 auto_semiring_t, 00153 auto_monoid_t>::ret 00154 auto_series_set_t; 00155 00156 typedef typename output_projection_traits<T>::ret auto_impl_t; 00157 typedef Element<Automata<auto_series_set_t, K>, auto_impl_t> ret; 00158 00159 static ret make_output_projection_automaton(const automaton_t& t); 00160 }; 00161 00162 // FMP Transducers 00163 // FIXME: it should be automata over a free monoid product 00164 // FIXME: we cannot use output_projection_traits, because 00165 // it constructs the type by assuming that the automaton is RW 00166 template <typename S, typename K, typename T> 00167 struct output_projection_helper<Automata<S, K>, T> 00168 { 00169 typedef Automata<S, K> structure_t; 00170 00171 typedef Element<structure_t, T> automaton_t; 00172 00173 typedef typename structure_t::series_set_t typeof_auto_series_set_t; 00174 00175 typedef typename structure_t::series_set_t::monoid_t::second_monoid_t 00176 auto_monoid_t; 00177 00178 typedef typename typeof_auto_series_set_t::semiring_t auto_semiring_t; 00179 typedef typename algebra::mute_series_traits<typeof_auto_series_set_t, 00180 auto_semiring_t, 00181 auto_monoid_t>::ret 00182 auto_series_set_t; 00183 00184 typedef typename fmp_output_projection_traits<T>::ret auto_impl_t; 00185 typedef Element<Automata<auto_series_set_t, K>, auto_impl_t> ret; 00186 00187 static ret make_output_projection_automaton(const automaton_t& t); 00188 }; 00189 00190 /*----------------. 00191 | IDENTITY TRAITS | 00192 `----------------*/ 00193 00194 template <typename S, typename K, typename T> 00195 struct identity_transducer_helper 00196 { 00197 typedef typename S::series_set_t series_set_t; 00198 typedef typename series_set_t::monoid_t monoid_t; 00199 typedef typename series_set_t::semiring_t semiring_t; 00200 typedef typename algebra::mute_series_traits<series_set_t, series_set_t, monoid_t> 00201 ::ret tseries_set_t; 00202 typedef typename extension_traits<T>::ret impl_t; 00203 typedef Element<Transducer<tseries_set_t, K>, impl_t> ret; 00204 }; 00205 00206 template <typename S, typename K, typename T> 00207 typename identity_transducer_helper<S, K, T>::ret 00208 partial_identity(const Element<S, T>&); 00209 00210 template <typename Series, typename Kind> 00211 bool 00212 operator==(const Transducer<Series, Kind>&, const Transducer<Series, Kind>&); 00213 00214 } // ! vcsn 00215 00216 00217 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB 00218 # include <vaucanson/automata/concept/transducer.hxx> 00219 #endif // VCSN_USE_INTERFACE_ONLY 00220 00221 00222 #endif // ! VCSN_AUTOMATA_CONCEPT_TRANSDUCER_HH