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(); }
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 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); }