Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
UnreachableStatesRemover.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <algorithm>
9#include <deque>
10#include <set>
11
16#include <automaton/FSM/NFA.h>
17#include <automaton/FSM/DFA.h>
18
19#include "../../properties/efficient/ReachableStates.h"
20
21namespace automaton {
22
23namespace simplify {
24
25namespace efficient {
26
28public:
32 template < class T >
33 static T remove( const T & fsm );
34 template < class SymbolType, class StateType >
36};
37
38template < class T >
40 using StateType = typename T::StateType;
41
42 // 1a
44
45 // 2
46 T M(fsm.getInitialState());
47
48 for( const auto & q : Qa )
49 M.addState( q );
50
51 for( const auto & a : fsm.getInputAlphabet( ) )
52 M.addInputSymbol( a );
53
54 for( const auto & transition : fsm.getTransitions( ) )
55 if( Qa.count( transition.first.first ) )
56 M.addTransition( transition.first.first, transition.first.second, transition.second );
57
58 ext::set<StateType> intersect;
59 std::set_intersection( fsm.getFinalStates( ).begin(), fsm.getFinalStates( ).end(), Qa.begin( ), Qa.end( ), std::inserter( intersect, intersect.begin( ) ) );
60 for( auto const & state : intersect )
61 M.addFinalState( state );
62
63 return M;
64}
65
66template < class SymbolType, class StateType >
68 // 1a
70
71 // 2
73
74 for( const auto & q : Qa )
75 M.addState( q );
76
78
79 for( const auto & a : fsm.getInputAlphabet( ) )
80 M.addInputSymbol( a );
81
82 for( const auto & transition : fsm.getTransitions( ) )
83 if( Qa.count( transition.first.first ) )
84 M.addTransition( transition.first.first, transition.first.second, transition.second );
85
86 ext::set<StateType> intersect;
87 std::set_intersection( fsm.getFinalStates( ).begin(), fsm.getFinalStates( ).end(), Qa.begin( ), Qa.end( ), std::inserter( intersect, intersect.begin( ) ) );
88 for( auto const & state : intersect )
89 M.addFinalState( state );
90
91 return M;
92}
93
94} /* namespace efficient */
95
96} /* namespace simplify */
97
98} /* namespace automaton */
99
Nondeterministic finite automaton with multiple initial states. Accepts regular languages.
Definition: MultiInitialStateNFA.h:69
bool addState(StateType state)
Definition: MultiInitialStateNFA.h:186
bool addFinalState(StateType state)
Definition: MultiInitialStateNFA.h:235
bool addInputSymbol(SymbolType symbol)
Definition: MultiInitialStateNFA.h:284
void setInitialStates(ext::set< StateType > states)
Definition: MultiInitialStateNFA.h:146
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
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: ReachableStates.h:37
Definition: UnreachableStatesRemover.h:27
static T remove(const T &fsm)
Definition: UnreachableStatesRemover.h:39
Definition: set.hpp:44
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
q
Definition: SingleInitialStateEpsilonTransition.h:85
Definition: ToGrammar.h:31