static void AutomataSample2() { NondeterminedFiniteAutomaton nfa = new NondeterminedFiniteAutomaton(); nfa.AddState("q0"); nfa.AddToStartStates("q0"); nfa.AddSymbol("a"); nfa.AddToFinalStates("q0"); nfa.AddTransition("q0", "q0", "a"); nfa.AddSymbol("b"); nfa.AddState("q1"); nfa.AddState("q2"); nfa.AddTransition("q0", "q2", "b"); nfa.AddTransition("q2", "q1", "b"); nfa.AddToFinalStates("q1"); var fromQ0ByB = nfa.GetTransitionDestinations("q0", "b"); if (fromQ0ByB.Count() != 0) { Console.WriteLine("Переход по символу b из состояния q0 приведёт в состояния: "); foreach (var state in fromQ0ByB) { Console.Write(state + " "); } } else { Console.WriteLine("По символу b из q0 нет переходов."); } }
static void AutomataSample3() { NondeterminedFiniteAutomaton nfa = new NondeterminedFiniteAutomaton(); nfa.AddState("q0"); nfa.AddState("q1"); nfa.AddState("q2"); nfa.AddToFinalStates("q2"); nfa.AddToStartStates("q0"); nfa.AddSymbol("А"); nfa.AddSymbol("Б"); nfa.AddTransition("q0", "q2", "А"); nfa. AddTransitionBySymbolsSequence("q0", "q1", new List <string>() { "А", "Б", "А" }); nfa.AddTransition("q1", "q2", "Б"); var fromQ0ByA = nfa.GetTransitionDestinations("q0", "А"); if (fromQ0ByA.Count() != 0) { Console.WriteLine("Переход по символу А из состояния q0 приведёт в состояния: "); foreach (var state in fromQ0ByA) { Console.Write(state + " "); } } else { Console.WriteLine("По символу А из q0 нет переходов."); } }
/// <summary> /// Создание автомата по таблице /// </summary> /// <param name="table"></param> /// <returns></returns> private NondeterminedFiniteAutomaton TableToNFA(List <List <string> > table) { NondeterminedFiniteAutomaton nfa = new NondeterminedFiniteAutomaton(); foreach (var sequence in symbolsSequence) { foreach (var symbol in sequence) { if (!nfa.IsSymbolExist(symbol)) { nfa.AddSymbol(symbol); } } } for (int i = 0; i < states.Count; i++) { nfa.AddState(states[i]); } for (int j = 0; j < transitionsBySequence.Count; j++) { for (int i = 0; i < transitionsBySequence[j].Destinations.Count; i++) { nfa.AddTransitionBySymbolsSequence( transitionsBySequence[j].Source, transitionsBySequence[j].Destinations[i], transitionsBySequence[j].Symbols); } } for (int j = 0; j < transitions.Count; j++) { for (int i = 0; i < transitions[j].Destinations.Count; i++) { nfa.AddTransition(transitions[j].Source, transitions[j].Destinations[i], transitions[j].Symbol); } } nfa.SetStartStates(new HashSet <string>(startStates)); nfa.SetFinalStates(new HashSet <string>(finalStates)); return(nfa); }