27 template <
typename ExpSet>
29 :
public ExpSet::const_visitor
36 static_assert(std::is_same<weightset_t, b>::value,
37 "star_normal_form: requires Boolean weights");
39 using weight_t =
typename weightset_t::value_t;
41 using super_t =
typename ExpSet::const_visitor;
44 constexpr
static const char* me() {
return "star_normal_form"; }
47 enum operation_t {
dot, box };
58 return std::move(res_);
68 res_ = operation_ == box ? rs_.zero() : rs_.one();
73 res_ = rs_.atom(v.value());
79 v.head()->accept(*
this);
81 for (
auto c: v.tail())
84 res = rs_.add(res, res_);
86 res_ = std::move(res);
97 using tuple_t = typename super_t::tuple_t;
98 virtual
void visit(const tuple_t&,
std::true_type)
override
100 raise(me(),
": tuple is not supported");
105 if (operation_ == box)
112 void box_of(
const prod_t& v)
129 v.head()->accept(*
this);
131 for (
auto c: v.tail())
134 res = rs_.add(res, res_);
136 res_ = std::move(res);
141 void dot_of(
const prod_t& v)
143 v.head()->accept(*
this);
145 for (
auto c: v.tail())
148 res = rs_.mul(res, res_);
150 res_ = std::move(res);
155 if (operation_ ==
dot)
158 v.sub()->accept(*
this);
159 res_ = rs_.star(res_);
160 res_ = rs_.lmul(ws_.star(
constant_term(rs_, v.sub())), res_);
165 v.sub()->accept(*
this);
176 operation_t operation_ =
dot;
182 template <
typename ExpSet>
184 typename ExpSet::value_t
196 template <
typename ExpSet>
201 const auto& e = exp->as<ExpSet>();
weightset_t_of< context_t > weightset_t
weight_t_of< ExpSet > constant_term(const ExpSet &rs, const typename ExpSet::value_t &e)
The constant term of e.
bool any_of(const Range &r, Predicate p)
typename expressionset_t::value_t expression_t
#define VCSN_RAT_VISIT(Type, Val)
std::ostream & dot(const Aut &aut, std::ostream &out, format fmt={})
Print an automaton in Graphviz's Dot format.
typename detail::context_t_of_impl< base_t< ValueSet >>::type context_t_of
context_t_of< expressionset_t > context_t
typename detail::weightset_t_of_impl< base_t< ValueSet >>::type weightset_t_of
expression star_normal_form(const expression &exp)
Bridge.
std::shared_ptr< detail::expression_base > expression
ExpSet::value_t star_normal_form(const ExpSet &rs, const typename ExpSet::value_t &e)
Star-normal form of an expression.
expression make_expression(const ExpSet &rs, const typename ExpSet::value_t &r)
#define VCSN_RAT_UNSUPPORTED(Type)