65 requires isDFA < T > || isNFA < T > || isEpsilonNFA < T > || isCompactNFA < T > || isExtendedNFA < T >
66 static T
remove (
const T & fsm );
78 template <
class SymbolType,
class StateType >
93 requires isDFTA < T > || isNFTA < T >
107 requires isAFDZA < T > || isAFNZA < T >
112requires isDFA < T > || isNFA < T > || isEpsilonNFA < T > || isCompactNFA < T > || isExtendedNFA < T >
120 T M(fsm.getInitialState());
123 M.setInputAlphabet( fsm.getInputAlphabet( ) );
125 for(
const auto & transition : fsm.getTransitions( ) )
126 if( Qa.count( transition.first.first ) )
127 M.addTransition( transition.first.first, transition.first.second, transition.second );
130 std::set_intersection( fsm.getFinalStates( ).begin(), fsm.getFinalStates( ).end(), Qa.
begin( ), Qa.
end( ), std::inserter( finalStates, finalStates.
begin( ) ) );
131 M.setFinalStates( finalStates );
136template <
class SymbolType,
class StateType >
149 if( Qa.count( transition.first.first ) )
150 M.
addTransition( transition.first.first, transition.first.second, transition.second );
160requires isDFTA < T > || isNFTA < T >
171 M.setInputAlphabet( fta.getInputAlphabet( ) );
173 for(
const auto & transition : fta.getTransitions( ) )
174 if(
std::all_of ( transition.first.second.begin ( ), transition.first.second.end ( ), [ & ] (
const StateType & state ) { return Qa.count ( state ); } ) )
175 M.addTransition ( transition.first.first, transition.first.second, transition.second );
178 std::set_intersection( fta.getFinalStates( ).begin(), fta.getFinalStates( ).end(), Qa.
begin( ), Qa.
end( ), std::inserter( finalStates, finalStates.
begin( ) ) );
179 M.setFinalStates( std::move ( finalStates ) );
185requires isAFDZA < T > || isAFNZA < T >
197 M.setInputAlphabet( afza.getInputAlphabet( ) );
199 for(
const auto & transition : afza.getTransitions( ) ) {
200 if ( transition.first.template is < SymbolType > ( ) && Qa.contains ( transition.second ) ) {
201 M.addTransition ( transition.first, transition.second );
203 const auto& [ q1, q2 ] = transition.first.template get < ext::pair < StateType, StateType > > ( );
204 if ( Qa.contains ( q1 ) && Qa.contains ( q2 ) && Qa.contains ( transition.second ) ) {
205 M.addTransition ( transition.first, transition.second );
211 std::set_intersection( afza.getFinalStates( ).begin(), afza.getFinalStates( ).end(), Qa.
begin( ), Qa.
end( ), std::inserter( finalStates, finalStates.
begin( ) ) );
212 M.setFinalStates( std::move ( finalStates ) );
Nondeterministic finite automaton with multiple initial states. Accepts regular languages.
Definition: MultiInitialStateNFA.h:69
void setStates(ext::set< StateType > states)
Definition: MultiInitialStateNFA.h:195
void setInitialStates(ext::set< StateType > states)
Definition: MultiInitialStateNFA.h:146
void setFinalStates(ext::set< StateType > states)
Definition: MultiInitialStateNFA.h:244
const ext::set< StateType > & getInitialStates() const &
Definition: MultiInitialStateNFA.h:117
const ext::multimap< ext::pair< StateType, SymbolType >, StateType > & getTransitions() const &
Definition: MultiInitialStateNFA.h:520
const ext::set< StateType > & getFinalStates() const &
Definition: MultiInitialStateNFA.h:215
void setInputAlphabet(ext::set< SymbolType > symbols)
Definition: MultiInitialStateNFA.h:302
const ext::set< SymbolType > & getInputAlphabet() const &
Definition: MultiInitialStateNFA.h:264
bool addTransition(StateType from, SymbolType input, StateType to)
Add a transition to the automaton.
Definition: MultiInitialStateNFA.h:486
static ext::set< typename T::StateType > reachableStates(const T &fsm)
Definition: UnreachableStatesRemover.h:53
static T remove(const T &fsm)
Definition: UnreachableStatesRemover.h:113
static T remove(const T &fta)
static T remove(const T &afza)
Class extending the pair class from the standard library. Original reason is to allow printing of the...
Definition: pair.hpp:43
auto begin() &
Inherited behavior of begin for non-const instance.
Definition: set.hpp:99
auto end() &
Inherited behavior of end for non-const instance.
Definition: set.hpp:129
typename T::StateType StateType
Definition: ToGrammarLeftRG.h:64
typename T::SymbolType SymbolType
Definition: ReachableStates.h:176
typename T::SymbolType SymbolType
Definition: SingleInitialStateEpsilonTransition.h:72
Definition: ToGrammar.h:31
all_of(T &&...) -> all_of< T... >