Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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);
        }