diff --git a/alib2algo/src/automaton/properties/DistinguishableStates.h b/alib2algo/src/automaton/properties/DistinguishableStates.h index 3a4237e45621a90d72ba891439c25d418b2ed960..0de068158c4fe05181bc8477b5915ebd15576dce 100644 --- a/alib2algo/src/automaton/properties/DistinguishableStates.h +++ b/alib2algo/src/automaton/properties/DistinguishableStates.h @@ -110,8 +110,9 @@ template < class SymbolType, class StateType > ext::set < ext::pair < StateType, StateType > > DistinguishableStates::distinguishable ( const automaton::DFTA < SymbolType, StateType > & fta ) { ext::set < ext::pair < StateType, StateType > > distinguishable = initial ( fta.getStates ( ), fta.getFinalStates ( ) ); + bool changed; do { - ext::set < ext::pair < StateType, StateType > > distinguishable2 = distinguishable; + changed = false; for ( const StateType & a : fta.getStates ( ) ) { for ( const StateType & b : fta.getStates ( ) ) { @@ -126,21 +127,19 @@ ext::set < ext::pair < StateType, StateType > > DistinguishableStates::distingui const auto & transition2 = fta.getTransitions ( ).find ( std::make_pair ( transition.first.first, std::move ( copy ) ) ); - if ( transition2 == fta.getTransitions ( ).end ( ) || distinguishable2.count ( ext::make_pair ( transition.second, transition2->second ) ) ) { + if ( transition2 == fta.getTransitions ( ).end ( ) || distinguishable.count ( ext::make_pair ( transition.second, transition2->second ) ) ) { // end up in dead state - dead state is be distinguishable from every other state OR // end up in distinguishable states distinguishable.insert ( ext::make_pair ( a, b ) ); distinguishable.insert ( ext::make_pair ( b, a ) ); + changed = true; } } } } } } - if ( distinguishable == distinguishable2 ) - break; - - } while ( true ); + } while ( changed ); return distinguishable; }