Algorithms Library Toolkit
A toolkit for algorithms, especially for algorithms on formal languages
UselessStatesRemover.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/UsefulStates.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 >
39T UselessStatesRemover::remove( const T & fsm ) {
40 using StateType = typename T::StateType;
41
42 // 1.
44
45 // 2.
46 T M(fsm.getInitialState());
47
48 for( const auto & a : fsm.getInputAlphabet( ) )
49 M.addInputSymbol( a );
50
51 if(Qu.empty ( )) {
52 return M;
53 }
54
55 for( const auto & q : Qu )
56 M.addState( q );
57
58 for( const auto & t : fsm.getTransitions( ) )
59 if( /* this part is not needed Qu.count( t.first.first ) && */ Qu.count( t.second ) )
60 M.addTransition( t.first.first, t.first.second, t.second );
61
62 for( const auto & q : fsm.getFinalStates( ) )
63 M.addFinalState( q );
64
65 return M;
66}
67
68template < class SymbolType, class StateType >
70 // 1.
72
73 // 2.
75
76 for( const auto & a : fsm.getInputAlphabet( ) )
77 M.addInputSymbol( a );
78
79 if(Qu.empty ( )) {
80 return M;
81 }
82
83 for( const auto & q : Qu )
84 M.addState( q );
85
86 for(const auto& init : fsm.getInitialStates()) {
87 if( Qu.count(init) )
88 M.addInitialState( init );
89 }
90
91 for( const auto & t : fsm.getTransitions( ) )
92 if( Qu.count(t.second) )
93 M.addTransition( t.first.first, t.first.second, t.second );
94
95 for( const auto & q : fsm.getFinalStates( ) )
96 M.addFinalState( q );
97
98 return M;
99}
100
101} /* namespace efficient */
102
103} /* namespace simplify */
104
105} /* namespace automaton */
106
Nondeterministic finite automaton with multiple initial states. Accepts regular languages.
Definition: MultiInitialStateNFA.h:69
bool addInitialState(StateType state)
Definition: MultiInitialStateNFA.h:137
bool addState(StateType state)
Definition: MultiInitialStateNFA.h:186
bool addFinalState(StateType state)
Definition: MultiInitialStateNFA.h:235
bool addInputSymbol(SymbolType symbol)
Definition: MultiInitialStateNFA.h:284
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 > usefulStates(const T &fsm)
Definition: UsefulStates.h:35
Definition: UselessStatesRemover.h:27
static T remove(const T &fsm)
Definition: UselessStatesRemover.h:39
Definition: set.hpp:44
typename T::StateType StateType
Definition: ToGrammarLeftRG.h:64
q
Definition: SingleInitialStateEpsilonTransition.h:85
Definition: ToGrammar.h:31