@@ -381,11 +381,14 @@ typename symbolic_automata<T, M>::automaton_t* symbolic_automata<T, M>::mk_produ
381
381
unsigned_vector final ;
382
382
unsigned_vector a_init, b_init;
383
383
a.get_epsilon_closure (a.init (), a_init);
384
+ bool a_init_is_final = false , b_init_is_final = false ;
384
385
for (unsigned ia : a_init) {
385
386
if (a.is_final_state (ia)) {
387
+ a_init_is_final = true ;
386
388
b.get_epsilon_closure (b.init (), b_init);
387
389
for (unsigned ib : b_init) {
388
390
if (b.is_final_state (ib)) {
391
+ b_init_is_final = true ;
389
392
final .push_back (0 );
390
393
break ;
391
394
}
@@ -438,8 +441,8 @@ typename symbolic_automata<T, M>::automaton_t* symbolic_automata<T, M>::mk_produ
438
441
}
439
442
440
443
svector<bool > back_reachable (n, false );
441
- for (unsigned i = 0 ; i < final . size (); ++i ) {
442
- back_reachable[final [i] ] = true ;
444
+ for (unsigned f : final ) {
445
+ back_reachable[f ] = true ;
443
446
}
444
447
445
448
unsigned_vector stack (final );
@@ -464,7 +467,7 @@ typename symbolic_automata<T, M>::automaton_t* symbolic_automata<T, M>::mk_produ
464
467
}
465
468
}
466
469
if (mvs1.empty ()) {
467
- if (a. is_final_state (a. init ()) && b. is_final_state (b. init ()) ) {
470
+ if (a_init_is_final && b_init_is_final ) {
468
471
// special case: automaton has no moves, but the initial state is final on both sides
469
472
// this results in the automaton which accepts the empty sequence and nothing else
470
473
final .clear ();
0 commit comments