12 template <
typename Context>
13 mutable_automaton<Context>
16 const auto& ls = *ctx.labelset();
17 const auto& gens = ls.generators();
19 require(2 <= boost::distance(gens),
20 "de_bruijn: ", ctx,
": the alphabet needs at least 2 letters");
24 auto new_universal_transition =
25 [&
res, &gens, &ls](
const auto src,
const auto dst)
28 res->new_transition(src, dst, ls.value(l));
32 const auto init =
res->new_state();
33 res->set_initial(init);
34 new_universal_transition(init, init);
36 auto last =
res->new_state();
40 last = new_universal_transition(last,
res->new_state());
55 template <
typename Ctx,
typename Un
signed>
59 const auto& c = ctx->
as<Ctx>();
mutable_automaton< Context > de_bruijn(const Context &ctx, unsigned n)
Build a automaton for (a+b)*a(a+b){n}.
Template-less root for contexts.
auto & as()
Downcast to the exact type.
Container::value_type front(const Container &container)
The first member of this Container.
automaton de_bruijn(const dyn::context &ctx, unsigned n)
Bridge.
mutable_automaton< Context > make_mutable_automaton(const Context &ctx)
void require(Bool b, Args &&... args)
If b is not verified, raise an error with args as message.