00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_ALGORITHMS_BRZOZOWSKI_HXX
00018 # define VCSN_ALGORITHMS_BRZOZOWSKI_HXX
00019
00020 # include <vaucanson/algorithms/brzozowski.hh>
00021
00022 # include <vaucanson/algorithms/internal/build_pattern.hh>
00023 # include <vaucanson/automata/concept/automata_base.hh>
00024
00025 # include <vaucanson/algorithms/krat_exp_constant_term.hh>
00026 # include <vaucanson/algorithms/krat_exp_derivation.hh>
00027 # include <vaucanson/algorithms/aci_canonical.hh>
00028 # include <vaucanson/misc/usual_macros.hh>
00029
00030 namespace vcsn {
00031
00032 using namespace algorithm_patterns;
00033
00046 template <typename T_auto, typename Exp>
00047 struct BrzozowskiAlgo : public IncAutomataConstructor <
00048 BrzozowskiAlgo<T_auto, Exp>,
00049 T_auto,
00050 Exp >
00051 {
00052 AUTOMATON_TYPES(T_auto);
00053 AUTOMATON_FREEMONOID_TYPES(T_auto);
00054
00055 BrzozowskiAlgo(const series_set_t& series, const Exp& exp):
00056 IncAutomataConstructor<BrzozowskiAlgo, T_auto, Exp>(series, exp)
00057 {}
00058
00060 void on_state(const Exp& e)
00061 {
00062 alphabet_t alpha = this->get()->series().monoid().alphabet();
00063 if (constant_term(e).first
00064 != e.structure().semiring().zero(SELECT(semiring_elt_value_t)))
00065 this->set_final();
00066 for (alphabet_iterator i = alpha.begin(); i != alpha.end(); ++i)
00067 this->link_to(canonical(derivate(e, *i).first), *i);
00068 }
00069 };
00070
00071 template<typename T_auto, typename Exp>
00072 T_auto*
00073 do_brzozowski(const T_auto& out, const Exp &kexp)
00074 {
00075 BrzozowskiAlgo<T_auto, Exp> brzozowski_algo(out.series(), canonical(kexp));
00076 brzozowski_algo.run();
00077 return brzozowski_algo.get();
00078 }
00079
00080 template<typename A, typename T, typename Exp>
00081 void
00082 brzozowski(Element<A, T>& out, const Exp& kexp)
00083 {
00084 TIMER_SCOPED("brzozowski");
00085 out = *do_brzozowski(out, kexp);
00086 }
00087
00088 }
00089
00090 #endif // ! VCSN_ALGORITHMS_BRZOZOWSKI_HXX