Trivially reduce [*];f to [*] if f accepts the empty word.
* src/ltlast/multop.cc (instance): Implement the reduction. * src/ltlast/multop.hh, doc/tl/tl.tex: Document it. * src/ltltest/equals.test: Test it.
This commit is contained in:
parent
e06b3b7974
commit
4a775a17a3
4 changed files with 47 additions and 5 deletions
|
|
@ -337,6 +337,44 @@ namespace spot
|
|||
abs = constant::false_instance();
|
||||
abs2 = 0;
|
||||
weak_abs = 0;
|
||||
|
||||
// - Concat(Exps1...,FExps2...,1[*],FExps3...,Exps4) =
|
||||
// Concat(Exps1...,1[*],Exps4)
|
||||
// If FExps2... and FExps3 all accept [*0].
|
||||
{
|
||||
vec::iterator i = v->begin();
|
||||
formula* os = bunop::one_star();
|
||||
while (i != v->end())
|
||||
{
|
||||
while (i != v->end() && !(*i)->accepts_eword())
|
||||
++i;
|
||||
if (i == v->end())
|
||||
break;
|
||||
vec::iterator b = i;
|
||||
// b is the first expressions that accepts [*0].
|
||||
// let's find more, and locate the position of
|
||||
// 1[*] at the same time.
|
||||
bool os_seen = false;
|
||||
do
|
||||
{
|
||||
os_seen |= (*i == os);
|
||||
++i;
|
||||
}
|
||||
while (i != v->end() && (*i)->accepts_eword());
|
||||
|
||||
if (os_seen) // [b..i) is a range that contains [*].
|
||||
{
|
||||
// Place [*] at the start of the range, and erase
|
||||
// all other formulae.
|
||||
(*b)->destroy();
|
||||
*b++ = os->clone();
|
||||
for (vec::iterator c = b; c < i; ++c)
|
||||
(*c)->destroy();
|
||||
i = v->erase(b, i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
case Fusion:
|
||||
neutral = constant::true_instance();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue