Skip to content
Snippets Groups Projects
Commit b8944909 authored by Jan Trávníček's avatar Jan Trávníček Committed by Jan Trávníček
Browse files

algo: Z-Automata: determinize

parent b1d55b7e
No related branches found
No related tags found
1 merge request!183Z automata
...@@ -126,4 +126,6 @@ Implemented as a no-op.\n\ ...@@ -126,4 +126,6 @@ Implemented as a no-op.\n\
@param dtm deterministic one-tape turing machine\n\ @param dtm deterministic one-tape turing machine\n\
@return deterministic one-tape turing machine equivalent to @p dtm" ); @return deterministic one-tape turing machine equivalent to @p dtm" );
   
auto DeterminizeArcFactoredNondeterministicZAutomaton = registration::AbstractRegister < automaton::determinize::Determinize, automaton::ArcFactoredDeterministicZAutomaton < DefaultSymbolType, ext::set < DefaultStateType > >, const automaton::ArcFactoredNondeterministicZAutomaton < > & > ( automaton::determinize::Determinize::determinize, "automaton" );
} /* namespace */ } /* namespace */
...@@ -33,6 +33,8 @@ ...@@ -33,6 +33,8 @@
#include <automaton/TA/DFTA.h> #include <automaton/TA/DFTA.h>
#include <automaton/TA/UnorderedNFTA.h> #include <automaton/TA/UnorderedNFTA.h>
#include <automaton/TA/UnorderedDFTA.h> #include <automaton/TA/UnorderedDFTA.h>
#include <automaton/TA/ArcFactoredNondeterministicZAutomaton.h>
#include <automaton/TA/ArcFactoredDeterministicZAutomaton.h>
   
#include <automaton/transform/PDAToRHPDA.h> #include <automaton/transform/PDAToRHPDA.h>
#include <automaton/transform/RHPDAToPDA.h> #include <automaton/transform/RHPDAToPDA.h>
...@@ -261,6 +263,9 @@ public: ...@@ -261,6 +263,9 @@ public:
*/ */
template < class SymbolType, class StateType > template < class SymbolType, class StateType >
static automaton::OneTapeDTM < SymbolType, StateType > determinize ( const automaton::OneTapeDTM < SymbolType, StateType > & automaton ); static automaton::OneTapeDTM < SymbolType, StateType > determinize ( const automaton::OneTapeDTM < SymbolType, StateType > & automaton );
template < class SymbolType, class StateType >
static automaton::ArcFactoredDeterministicZAutomaton < SymbolType, ext::set < StateType > > determinize ( const automaton::ArcFactoredNondeterministicZAutomaton < SymbolType, StateType > & automaton );
}; };
   
template < class SymbolType, class StateType > template < class SymbolType, class StateType >
...@@ -325,4 +330,5 @@ automaton::OneTapeDTM < SymbolType, StateType > Determinize::determinize ( const ...@@ -325,4 +330,5 @@ automaton::OneTapeDTM < SymbolType, StateType > Determinize::determinize ( const
#include "DeterminizeNFTAPart.hxx" #include "DeterminizeNFTAPart.hxx"
#include "DeterminizeVPAPart.hxx" #include "DeterminizeVPAPart.hxx"
#include "DeterminizeRHDPDAPart.hxx" #include "DeterminizeRHDPDAPart.hxx"
#include "DeterminizeZAutomataPart.hxx"
   
#include <alib/deque>
#include <alib/algorithm>
#include <alib/set>
namespace automaton {
namespace determinize {
template < class SymbolType, class StateType >
automaton::ArcFactoredDeterministicZAutomaton < SymbolType, ext::set < StateType > > Determinize::determinize ( const automaton::ArcFactoredNondeterministicZAutomaton < SymbolType, StateType > & automaton ) {
automaton::ArcFactoredDeterministicZAutomaton < SymbolType, ext::set < StateType > > res;
res.setInputAlphabet ( automaton.getInputAlphabet ( ) );
for ( const SymbolType & input : automaton.getInputAlphabet ( ) ) {
auto range = automaton.getTransitions ( ).equal_range ( input );
ext::set < StateType > dfaState;
for ( auto & transition : range )
dfaState.insert ( transition.second );
res.addState ( dfaState );
res.addTransition ( input, dfaState );
}
bool changed;
do {
changed = false;
for ( const ext::set < StateType > & dfaState1 : res.getStates ( ) ) {
for ( const ext::set < StateType > & dfaState2 : res.getStates ( ) ) {
ext::set < StateType > dfaState;
for ( const StateType & nfaState1 : dfaState1 ) {
for ( const StateType & nfaState2 : dfaState2 ) {
auto range = automaton.getTransitions ( ).equal_range ( ext::make_pair ( nfaState1, nfaState2 ) );
for ( auto & transition : range )
dfaState.insert ( transition.second );
}
}
changed |= res.addState ( dfaState );
res.addTransition ( ext::make_pair ( dfaState1, dfaState2 ), std::move ( dfaState ) );
}
}
} while ( changed );
const ext::set < StateType > & finalLabels = automaton.getFinalStates();
for ( const ext::set < StateType > & dfaState : res.getStates ( ) )
if ( ! ext::excludes ( finalLabels.begin ( ), finalLabels.end ( ), dfaState.begin ( ), dfaState.end ( ) ) )
res.addFinalState ( dfaState );
return res;
}
} /* namespace determinize */
} /* namespace automaton */
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment