00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_HH
00018 # define VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_HH
00019
00020 # include <list>
00021
00022 # include <vaucanson/algebra/implementation/series/series.hh>
00023 # include <vaucanson/algebra/implementation/series/rat/exp.hh>
00024 # include <vaucanson/algebra/implementation/series/rat/dump_visitor.hh>
00025
00026 namespace vcsn {
00027
00028 namespace algebra {
00029
00030
00031
00032
00033
00034 template<typename Tm, typename Tw>
00035 struct series_traits<rat::exp<Tm, Tw> >
00036 {
00037 typedef Tm monoid_elt_value_t;
00038 typedef Tw semiring_elt_value_t;
00039 typedef std::list<monoid_elt_value_t> support_t;
00040 };
00041
00042 template <class Tm, class Tw, class W, class M>
00043 struct mute_series_impl<rat::exp<Tm, Tw>, W, M>
00044 {
00045 typedef rat::exp<M, W> ret;
00046 };
00047
00048 }
00049
00050
00051
00052
00053 template<typename W, typename M, typename Tm, typename Tw>
00054 struct MetaElement<algebra::Series<W, M>, rat::exp<Tm, Tw> >
00055 : MetaElement<algebra::SeriesBase<algebra::Series<W, M> >,
00056 rat::exp<Tm, Tw> >
00057 {
00058 static const bool dynamic_value = true;
00059
00060 void accept(const rat::ConstNodeVisitor<Tm, Tw>& v) const;
00061 size_t depth() const;
00062 };
00063
00064
00065 namespace algebra {
00066
00067 template<typename W, typename M, typename Tm, typename Tw>
00068 bool op_contains(const algebra::Series<W, M>& s,
00069 const rat::exp<Tm, Tw>& m);
00070
00071 template<typename W, typename M, typename Tm, typename Tw>
00072 bool op_is_finite_app(const algebra::Series<W, M>& s,
00073 const rat::exp<Tm, Tw>& m);
00074
00075 template <typename W, typename M, typename Tm, typename Tw>
00076 Tm op_choose_from_supp(const algebra::Series<W, M>& s,
00077 const rat::exp<Tm, Tw>& m);
00078
00079 template<typename W, typename M, typename Tm, typename Tw>
00080 const rat::exp<Tm, Tw>& identity_value(SELECTOR2(algebra::Series<W, M>),
00081 SELECTOR2(rat::exp<Tm, Tw>));
00082
00083 template<typename W, typename M, typename Tm, typename Tw>
00084 bool show_identity_value(SELECTOR2(algebra::Series<W, M>),
00085 SELECTOR2(rat::exp<Tm, Tw>));
00086
00087
00088 template<typename W, typename M, typename Tm, typename Tw>
00089 const rat::exp<Tm, Tw>& zero_value(SELECTOR2(algebra::Series<W, M>),
00090 SELECTOR2(rat::exp<Tm, Tw>));
00091
00092
00093 template<typename W, typename M, typename Tm, typename Tw>
00094 void op_in_add(const algebra::Series<W, M>& s,
00095 rat::exp<Tm, Tw>& dst,
00096 const rat::exp<Tm, Tw>& arg);
00097
00098 template<typename W, typename M, typename Tm, typename Tw>
00099 rat::exp<Tm, Tw> op_mul(const algebra::Series<W, M>& s,
00100 const rat::exp<Tm, Tw>& a,
00101 const rat::exp<Tm, Tw>& b);
00102
00103 template<typename W, typename M, typename Tm, typename Tw>
00104 void op_in_mul(const algebra::Series<W, M>& s,
00105 rat::exp<Tm, Tw>& dst,
00106 const rat::exp<Tm, Tw>& arg);
00107
00108 template<typename W, typename M, typename Tm, typename Tw>
00109 rat::exp<Tm, Tw> op_mul(const algebra::Series<W, M>& s,
00110 const rat::exp<Tm, Tw>& a,
00111 const rat::exp<Tm, Tw>& b);
00112
00113
00114
00115
00116
00117
00118 template<typename Tm, typename Tw, typename M, typename W>
00119 rat::exp<Tm, Tw> op_convert(SELECTOR2(algebra::Series<M, W>),
00120 SELECTOR2(rat::exp<Tm, Tw>),
00121 const Tm& m_value);
00122
00123 template<typename Tm, typename Tw, typename M, typename W>
00124 rat::exp<Tm, Tw> op_convert(SELECTOR2(algebra::Series<M, W>),
00125 SELECTOR2(rat::exp<Tm, Tw>),
00126 char m_value);
00127
00128 template<typename Tm, typename Tw, typename W, typename M, typename oTm>
00129 rat::exp<Tm, Tw> op_convert(SELECTOR2(algebra::Series<W, M>),
00130 SELECTOR2(rat::exp<Tm, Tw>),
00131 SELECTOR(M),
00132 const oTm& m_value);
00133
00134 template<typename Tm, typename Tw, typename W, typename M, typename oTw>
00135 rat::exp<Tm, Tw> op_convert(SELECTOR2(algebra::Series<W, M>),
00136 SELECTOR2(rat::exp<Tm, Tw>),
00137 SELECTOR(W),
00138 const oTw& w_value);
00139
00140 template<typename W, typename M, typename Tm, typename Tw, typename oTm>
00141 void op_assign(const algebra::Series<W, M>& s,
00142 const M& monoid,
00143 rat::exp<Tm, Tw>& dst,
00144 const oTm& src);
00145
00146 template<typename W, typename M, typename Tm, typename Tw, typename oTw>
00147 void op_assign(const algebra::Series<W, M>& s,
00148 const W& semiring,
00149 rat::exp<Tm, Tw>& dst,
00150 const oTw& src);
00151
00152
00153
00154
00155
00156 template<typename W, typename M, typename Tm, typename Tw>
00157 bool op_starable(const algebra::Series<W, M>& s,
00158 const rat::exp<Tm, Tw>& dst);
00159
00160 template<typename W, typename M, typename Tm, typename Tw>
00161 void op_in_star(const algebra::Series<W, M>& s,
00162 rat::exp<Tm, Tw>& dst);
00163
00164 template<typename W, typename M, typename Tm, typename Tw>
00165 rat::exp<Tm, Tw>
00166 op_star(const algebra::Series<W, M>& s,
00167 const rat::exp<Tm, Tw>& src);
00168
00169 }
00170
00171
00172
00173
00174
00175 template<typename M, typename W, typename oTm, typename Tm, typename Tw>
00176 struct op_add_traits<M, algebra::Series<W, M>, oTm, rat::exp<Tm, Tw> >
00177 {
00178 typedef Element<algebra::Series<W, M>, rat::exp<Tm, Tw> > ret_t;
00179 };
00180
00181 namespace algebra {
00182
00183 template<typename W, typename M, typename Tm, typename Tw, typename oTm>
00184 void op_in_add(const algebra::Series<W, M>& s,
00185 const M& monoid,
00186 rat::exp<Tm, Tw>& dst,
00187 const oTm& src);
00188
00189 template<typename W, typename M, typename Tm, typename Tw, typename oTm>
00190 rat::exp<Tm, Tw> op_add(const algebra::Series<W, M>& s,
00191 const M& monoid,
00192 const rat::exp<Tm, Tw>& a,
00193 const oTm& b);
00194
00195 template<typename M, typename W, typename oTm, typename Tm, typename Tw>
00196 rat::exp<Tm, Tw> op_add(const M& monoid,
00197 const algebra::Series<W, M>& s,
00198 const oTm& a,
00199 const rat::exp<Tm, Tw>& b);
00200
00201 }
00202
00203
00204
00205
00206
00207 template<typename W, typename M, typename oTw, typename Tm, typename Tw>
00208 struct op_add_traits<W, algebra::Series<W, M>, oTw, rat::exp<Tm, Tw> >
00209 {
00210 typedef Element<algebra::Series<W, M>, rat::exp<Tm, Tw> > ret_t;
00211 };
00212
00213 namespace algebra {
00214
00215 template<typename W, typename M, typename Tm, typename Tw, typename oTw>
00216 void op_in_add(const algebra::Series<W, M>& s,
00217 const W& semiring,
00218 rat::exp<Tm, Tw>& dst,
00219 const oTw& src);
00220
00221 template<typename W, typename M, typename Tm, typename Tw, typename oTw>
00222 rat::exp<Tm, Tw> op_add(const algebra::Series<W, M>& s,
00223 const W& semiring,
00224 const rat::exp<Tm, Tw>& a,
00225 const oTw& b);
00226
00227 template<typename W, typename M, typename oTw, typename Tm, typename Tw>
00228 rat::exp<Tm, Tw> op_add(const W& semiring,
00229 const algebra::Series<W, M>& s,
00230 const oTw& a,
00231 const rat::exp<Tm, Tw>& b);
00232
00233 }
00234
00235
00236
00237
00238
00239 template<typename W, typename M, typename oTw, typename Tm, typename Tw>
00240 struct op_mul_traits<W, algebra::Series<W, M>, oTw, rat::exp<Tm, Tw> >
00241 {
00242 typedef Element<algebra::Series<W, M>, rat::exp<Tm, Tw> > ret_t;
00243 };
00244
00245 namespace algebra {
00246
00247 template<typename W, typename M, typename Tm, typename Tw, typename oTw>
00248 void op_in_mul(const algebra::Series<W, M>& s,
00249 const W& semiring,
00250 rat::exp<Tm, Tw>& ret,
00251 const oTw& w);
00252
00253 template<typename W, typename M, typename Tm, typename Tw, typename oTw>
00254 rat::exp<Tm, Tw> op_mul(const algebra::Series<W, M>& s,
00255 const W& semiring,
00256 const rat::exp<Tm, Tw>& a,
00257 const oTw& w);
00258
00259 template<typename W, typename M, typename oTw, typename Tm, typename Tw>
00260 rat::exp<Tm, Tw> op_mul(const W& semiring,
00261 const algebra::Series<W, M>& s,
00262 const oTw& w,
00263 const rat::exp<Tm, Tw>& b);
00264
00265
00266
00267
00268 template<typename W, typename M, typename Tm, typename Tw, typename oTm>
00269 Tw op_series_get(const algebra::Series<W, M>& s,
00270 const rat::exp<Tm, Tw>& p,
00271 const oTm& m);
00272
00273 template<typename W, typename M, typename Tm,
00274 typename Tw, typename oTm, typename oTw>
00275 void op_series_set(const algebra::Series<W, M>& s,
00276 const rat::exp<Tm, Tw>& p,
00277 const oTm& m,
00278 const oTw& w);
00279
00280 template <class W, class M, class Tm, class Tw>
00281 Element<algebra::Series<W,M>, rat::exp<Tm,Tw> >
00282 op_choose(const algebra::Series<W,M>& s,
00283 SELECTOR2(rat::exp<Tm,Tw>));
00284
00285 template <typename W, typename M, typename Tm, typename Tw, typename St>
00286 St&
00287 op_rout(const algebra::Series<W, M>&,
00288 St& st,
00289 const rat::exp<Tm, Tw>&);
00290
00291
00292
00293
00294
00295 template <typename W, typename M, typename Tm, typename Tw>
00296 void op_in_transpose(const algebra::Series<W, M>& s,
00297 rat::exp<Tm, Tw>& dst);
00298
00299
00300 }
00301
00302 template<typename W, typename M, typename Tm, typename Tw>
00303 struct semiring_traits<algebra::Series<W, M>, rat::exp<Tm, Tw> >
00304 {
00305 enum { is_positive = 1 };
00306 };
00307
00308 }
00309
00310
00311 # if !defined VCSN_USE_INTERFACE_ONLY || defined VCSN_USE_LIB
00312 # include <vaucanson/algebra/implementation/series/krat.hxx>
00313 #endif // VCSN_USE_INTERFACE_ONLY
00314
00315
00316 #endif // ! VCSN_ALGEBRA_IMPLEMENTATION_SERIES_KRAT_HH