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