static void AutomataSample4() { NondeterminedFiniteAutomaton nfa = new NondeterminedFiniteAutomaton(); nfa.AddStates(new string[] { "q0", "q1", "q2", "q3", "q4" }); nfa.AddSymbols(new string[] { "a", "b" }); nfa.SetFinalStates(new HashSet <string>() { "q3", "q2" }); nfa.SetStartStates(new HashSet <string>() { "q0" }); nfa.AddTransition("q0", "q3", "b"); nfa.AddTransition("q0", "q2", "eps"); nfa.AddTransition("q0", "q1", "a"); nfa.AddTransition("q1", "q4", "b"); nfa.AddTransition("q2", "q1", "eps"); nfa.AddTransition("q3", "q2", "b"); nfa.AddTransition("q4", "q1", "a"); nfa.AddTransition("q4", "q2", "b"); nfa.AddTransition("q4", "q0", "b"); NondeterminedFiniteAutomaton NoEpsNfa = nfa.GetEquivalentDeletedEpsilons(); }
public static DeterminedFiniteAutomaton ConvertNFAToDFA(NondeterminedFiniteAutomaton nfa) { //DeterminedFiniteAutomaton dfa nfa = nfa.GetEquivalentDeletedEpsilons(); HashSet <string> currentStates, accessibleStates; List <HashSet <string> > allSetsOfStates = new List <HashSet <string> >(); allSetsOfStates.Add(new HashSet <string>(nfa.GetStartStates())); DeterminedFiniteAutomaton dfa = new DeterminedFiniteAutomaton("q0"); List <string> names = new List <string>(); dfa.AddSymbols(nfa.GetAlphabet()); var finalStates = nfa.GetFinalStates(); string from, to; bool f = true; for (int allSetsCounter = 0, currentSetNumber = 0, pos; currentSetNumber <= allSetsCounter; currentSetNumber++) { currentStates = allSetsOfStates[currentSetNumber]; if (currentStates.Any(state => nfa.GetFinalStates().Contains(state))) { dfa.AddToFinalStates(string.Format("q{0}", currentSetNumber)); } foreach (var symbol in nfa.GetAlphabet()) { accessibleStates = GetAccessibleStates(nfa, currentStates, symbol); if (accessibleStates.Count != 0) { pos = CheckIsListContains(allSetsOfStates, accessibleStates); from = string.Format("q{0}", currentSetNumber); to = string.Format("q{0}", pos); if (pos == -1) { allSetsCounter++; to = string.Format("q{0}", allSetsCounter); dfa.AddState(to); allSetsOfStates.Add(new HashSet <string>(accessibleStates)); } dfa.AddTransition(from, to, symbol); } } } return(dfa); }