예제 #1
0
        static void Main(string[] args)
        {
            AutomataConverterApplication app = new AutomataConverterApplication();
            NondeterminedFiniteAutomaton nfa = new NondeterminedFiniteAutomaton();

            nfa.AddSymbols(new string[] { "a", "b", "c" });
            nfa.AddStates(new string[] { "q0", "q1", "q2", "q3", "q4", "q5" });
            nfa.SetStartStates(new HashSet <string>()
            {
                "q0", "q1"
            });

            nfa.SetFinalStates(new HashSet <string>()
            {
                "q5"
            });
            /*nfa.AddTransitionBySymbolsSequence("q0", "q1", new List<int>() {"" })*/

            app.AddCommand(new HelpCommand(app));
            app.AddCommand(new ReadAvtomateCommand(app));
            app.AddCommand(new ConvertAutomateCommand(app));
            app.AddCommand(new WriteAutomateCommand(app));
            app.AddCommand(new ExitCommand(app));
            app.AddCommand(new ShowStorageCommand(app));
            app.AddCommand(new DeleteEpsilonTransitionsCommand(app));
            app.Run();
        }
예제 #2
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();
        }
예제 #3
0
        public static NondeterminedFiniteAutomaton GetEquivalentDeletedEpsilons(this
                                                                                NondeterminedFiniteAutomaton epsilonNfa)
        {
            NondeterminedFiniteAutomaton noEpsilonsNfa = new NondeterminedFiniteAutomaton();
            // копируем состояния и алфавит
            var alphabet    = epsilonNfa.GetAlphabet();
            var states      = epsilonNfa.GetStates();
            var finalStates = new HashSet <string>(epsilonNfa.GetFinalStates());
            var startStates = new HashSet <string>(epsilonNfa.GetStartStates());

            noEpsilonsNfa.AddSymbols(alphabet);
            noEpsilonsNfa.AddStates(states);
            noEpsilonsNfa.SetFinalStates(finalStates);
            noEpsilonsNfa.SetStartStates(startStates);
            // добавляем необходимые переходы
            foreach (var state in states)
            {
                // состояния в которые мы можем перейти из состояния state, используя эпсилон переходы.
                var statesReachByEpsilons = GetAllDestinationsByEpsilons(epsilonNfa, state);
                foreach (var symbol in alphabet)
                {
                    // состояния в которые мы можем попасть используя сперва эпсилон переходы,
                    // а затем символ symbol единажды
                    var statesReachByEpsilonsAndSymbol = statesReachByEpsilons.SelectMany((reachedByEps)
                                                                                          => (epsilonNfa.GetTransitionDestinations(reachedByEps, symbol))).Distinct();
                    // состояния в которые мы можем перейти из состояния state, используя символ symbol единажды
                    // и эпсилон переходы в любом порядке
                    var statesOneSymbolAndEpsilons = statesReachByEpsilonsAndSymbol.SelectMany((stateFrom
                                                                                                => GetAllDestinationsByEpsilons(epsilonNfa, stateFrom))).Distinct();
                    foreach (var reachedState in statesOneSymbolAndEpsilons)
                    {
                        noEpsilonsNfa.AddTransition(state, reachedState, symbol);
                    }
                }
                if (startStates.Contains(state))
                {
                    foreach (var s in statesReachByEpsilons)
                    {
                        startStates.Add(s);
                        noEpsilonsNfa.AddToStartStates(s);
                    }
                }
                // Если это начальное состояние и из него достижимо заключительное по эпсилон
                // то сделаем его заключительным
                if (startStates.Contains(state) && statesReachByEpsilons.Any(finalStates.Contains))
                {
                    noEpsilonsNfa.AddToFinalStates(state);
                }
            }
            foreach (var state in finalStates)
            {
                noEpsilonsNfa.AddToFinalStates(state);
            }
            return(noEpsilonsNfa);
        }