17 #ifndef VCSN_ALGORITHMS_KRAT_EXP_PARTIAL_DERIVATION_HXX 
   18 # define VCSN_ALGORITHMS_KRAT_EXP_PARTIAL_DERIVATION_HXX 
   22 # include <vaucanson/algebra/implementation/series/krat_exp_pattern.hh> 
   34     template <
typename T, 
typename U>
 
   35     std::set<T> operator^ (std::set<T> 
set, U other)
 
   37       typedef typename std::set<T>::iterator    iterator;
 
   39       for (iterator i = 
set.begin(); i != 
set.end(); ++i)
 
   40         result.insert(*i * other);
 
   44     template <
typename T, 
typename U>
 
   45     std::set<T> operator^ (U other, std::set<T> 
set)
 
   47       typedef typename std::set<T>::iterator    iterator;
 
   49       for (iterator i = 
set.begin(); i != 
set.end(); ++i)
 
   50         result.insert(other * *i);
 
   56     std::set<T> operator+ (std::set<T> s1, std::set<T> s2)
 
   59       merge(s1.begin(), s1.end(),
 
   61             inserter(result, result.begin()));
 
   67     template <
class Series, 
class T, 
class Dispatch>
 
   68     struct KRatExpPartialDerivation : algebra::KRatExpMatcher<
 
   69       KRatExpPartialDerivation<Series, T, Dispatch>,
 
   71       std::set<Element<Series, T> >,
 
   75       typedef KRatExpPartialDerivation<Series, T, Dispatch>     self_t;
 
   76       typedef Element<Series, T>                                        exp_t;
 
   77       typedef std::set<exp_t>                                   set_t;
 
   78       typedef set_t                                             return_type;
 
   79       typedef typename set_t::iterator  iterator;
 
   80       typedef typename Element<Series, T>::semiring_elt_t               semiring_elt_t;
 
   81       typedef typename semiring_elt_t::value_t                          semiring_elt_value_t;
 
   82       typedef typename Element<Series, T>::monoid_elt_t         monoid_elt_t;
 
   83       typedef typename monoid_elt_t::value_t                    monoid_elt_value_t;
 
   84       typedef typename monoid_elt_t::set_t                      monoid_t;
 
   85       typedef typename monoid_t::alphabet_t                     alphabet_t;
 
   86       typedef typename alphabet_t::letter_t                     letter_t;
 
   87       INHERIT_CONSTRUCTORS(self_t, T, semiring_elt_t, Dispatch);
 
   89       KRatExpPartialDerivation(
const Element<Series, T>& exp,
 
   96       Element<Series, T> series(
const T& e)
 
   98         return Element<Series, T>(exp_.structure(), e);
 
  101       MATCH__(Product, lhs, rhs)
 
  103         std::pair<semiring_elt_t, bool> ret = constant_term(series(lhs));
 
  104         if (ret.second == 
false)
 
  107             return return_type();
 
  110             exp_.structure().semiring().zero(
SELECT(semiring_elt_value_t)))
 
  111           return (
match(lhs) ^ rhs) + (ret.first ^ 
match(rhs));
 
  113           return (
match(lhs) ^ rhs);
 
  117       MATCH__(Sum, lhs, rhs)
 
  125         std::pair<semiring_elt_t, bool> ret = constant_term(series(e));
 
  126         if ((ret.second == 
false) || (ret.first.starable() == 
false))
 
  129             return return_type();
 
  131         return ret.first.star() ^ (
match(e) ^ e.clone().star());
 
  135       MATCH__(LeftWeight, w, e)
 
  137         return semiring_elt_t(w) ^ 
match(e);
 
  141       MATCH__(RightWeight, e, w)
 
  143         return match(e) ^ semiring_elt_t(w);
 
  153               res.insert(algebra::identity_as<T>::of(exp_.structure()));
 
  155               res.insert(Element<Series, T> (exp_.structure(), m.substr(1)));
 
  163         return return_type();
 
  169         return return_type();
 
  176       Element<Series, T>  exp_;
 
  182   template <
class Series, 
class T, 
class Letter>
 
  183   std::pair<std::set<Element<Series, T> >, 
bool>
 
  187     algebra::KRatExpPartialDerivation<Series, T, algebra::DispatchFunction<T> >
 
  189     std::set<Element<Series, T> > ret = matcher.match(exp.
value());
 
  190     if (matcher.undefined)
 
  191       return std::make_pair(ret, 
false);
 
  192     return std::make_pair(ret, 
true);
 
  197 #endif // ! VCSN_ALGORITHMS_KRAT_EXP_PARTIAL_DERIVATION_HXX