static void testEpsilonNDFA() { char[] alphabet = { 'a', 'b' }; var m = new Automaat <string>(alphabet); m.AddTransition(new Transition <string>("1", alphabet[0], "1")); m.AddTransition(new Transition <string>("1", alphabet[0], "2")); m.AddTransition(new Transition <string>("1", Transition <string> .Epsilon, "3")); m.AddTransition(new Transition <string>("2", alphabet[1], "4")); m.AddTransition(new Transition <string>("3", alphabet[1], "5")); m.DefineAsStartState("1"); m.DefineAsFinalState("5"); //woord bevat 1 b en eindigt op 1 b var testWords = new List <Tuple <string, bool> >(); testWords.Add(new Tuple <string, bool>("b", true)); testWords.Add(new Tuple <string, bool>("ab", true)); testWords.Add(new Tuple <string, bool>("a", false)); testWords.Add(new Tuple <string, bool>("bba", false)); testWords.Add(new Tuple <string, bool>("aaab", true)); //TestingAutomaat("Testing for epsilon transitions", m, testWords); var dfa = NdfatoDfa.MakeDfa(m); dfa.PrintTransitions(); TestingAutomaat("Testing for epsilon transitions", dfa, testWords); }
private static void FindNextState(ref Automaat <State> a, ref int counter, Automaat <T> a1, Automaat <T> a2, State s) { foreach (var c in a.GetAlphabet()) { var a1State = a1.GetTransitions(s.StateAutomaat1, c).First().ToState; var a2State = a2.GetTransitions(s.StateAutomaat2, c).First().ToState; var newState = default(State); var stateExsists = false; foreach (var state in a._states) { if (!state.HaseSameStates(a1State, a2State)) { continue; } newState = state; stateExsists = true; break; } if (!stateExsists) { newState = new State(++counter, a1State, a2State); a.AddTransition(new Transition <State>(s, c, newState)); FindNextState(ref a, ref counter, a1, a2, newState); } else { a.AddTransition(new Transition <State>(s, c, newState)); } } }
private static Automaat <int> GetEvenBOrUnevenA() { char[] alphabet = { 'a', 'b' }; Automaat <int> m = new Automaat <int>(alphabet); m.AddTransition(new Transition <int>(1, alphabet[0], 2)); m.AddTransition(new Transition <int>(1, alphabet[1], 3)); m.AddTransition(new Transition <int>(2, alphabet[0], 1)); m.AddTransition(new Transition <int>(2, alphabet[1], 5)); m.AddTransition(new Transition <int>(3, alphabet[0], 2)); m.AddTransition(new Transition <int>(3, alphabet[1], 4)); m.AddTransition(new Transition <int>(4, alphabet[0], 2)); m.AddTransition(new Transition <int>(4, alphabet[1], 4)); m.AddTransition(new Transition <int>(5, alphabet[0], 1)); m.AddTransition(new Transition <int>(5, alphabet[1], 4)); // only on start state in a dfa: m.DefineAsStartState(1); // two final states: m.DefineAsFinalState(2); m.DefineAsFinalState(4); m.DefineAsFinalState(5); return(m); }
private static void GramToNdfaAndReverse() { char[] alphabet = { 'a', 'b' }; var ndfa = new Automaat <int>(alphabet); ndfa.AddTransition(new Transition <int>(0, alphabet[0], 0)); ndfa.AddTransition(new Transition <int>(0, alphabet[0], 1)); ndfa.AddTransition(new Transition <int>(0, alphabet[1], 0)); ndfa.AddTransition(new Transition <int>(0, alphabet[1], 3)); ndfa.AddTransition(new Transition <int>(1, alphabet[0], 2)); ndfa.AddTransition(new Transition <int>(2, alphabet[0])); ndfa.AddTransition(new Transition <int>(2, alphabet[1])); ndfa.AddTransition(new Transition <int>(3, alphabet[1], 4)); ndfa.AddTransition(new Transition <int>(4, alphabet[0])); ndfa.AddTransition(new Transition <int>(4, alphabet[1])); ndfa.DefineAsStartState(0); ndfa.DefineAsFinalState(2); ndfa.DefineAsFinalState(4); Graphviz.PrintGraph(ndfa, "ndfaToGram"); var gram = RegGram <int> .NdfaToRegGram(ndfa); Console.WriteLine(gram.ToString()); }
private static Automaat <int> EindigtOp(string rulesymbols, char[] alphabet) { var a = new Automaat <int>(alphabet); var stateCounter = 0; var startState = ++stateCounter; var fromState = startState; a.DefineAsStartState(fromState); var word = ""; foreach (var s in rulesymbols.ToCharArray()) { stateCounter++; word += s; foreach (var letter in a.GetAlphabet()) { if (s == letter) { a.AddTransition(new Transition <int>(fromState, s, stateCounter)); } else { int i; for (i = 0; i < word.Length; i++) { if (word[i] != letter) { break; } } a.AddTransition(new Transition <int>(fromState, letter, i + startState)); } } fromState = stateCounter; } foreach (var letter in a.GetAlphabet()) { int i; for (i = 0; i < rulesymbols.Length; i++) { if (word[i] != letter) { break; } } a.AddTransition(new Transition <int>(fromState, letter, i + startState)); } a.DefineAsFinalState(stateCounter); return(a); }
static void Ndfa() { char[] alphabet = { 'a', 'b' }; Automaat <string> m = new Automaat <string>(alphabet); m.AddTransition(new Transition <string>("1", alphabet[0], "2")); m.AddTransition(new Transition <string>("1", alphabet[0], "3")); m.AddTransition(new Transition <string>("1", alphabet[1], "1")); m.AddTransition(new Transition <string>("2", alphabet[0], "2")); m.AddTransition(new Transition <string>("2", alphabet[1], "2")); m.AddTransition(new Transition <string>("3", alphabet[0], "2")); m.AddTransition(new Transition <string>("3", alphabet[1], "4")); m.AddTransition(new Transition <string>("4", alphabet[0], "2")); m.AddTransition(new Transition <string>("4", alphabet[1], "2")); // only on start state in a dfa: m.DefineAsStartState("1"); // two final states: m.DefineAsFinalState("4"); var testWords = new List <Tuple <string, bool> >(); testWords.Add(new Tuple <string, bool>("ab", true)); testWords.Add(new Tuple <string, bool>("ba", false)); testWords.Add(new Tuple <string, bool>("aa", false)); testWords.Add(new Tuple <string, bool>("bbab", true)); TestingAutomaat("testing code for ndfa", m, testWords); }
public static void Regel5(RegExp reg, ref Automaat <int> a, ref int c, int leftState, int rightState) { var newLeftState = c + 1; var newRightState = newLeftState + 1; c = newRightState; a.AddTransition(new Transition <int>(leftState, Transition <int> .Epsilon, newLeftState)); a.AddTransition(new Transition <int>(newRightState, Transition <int> .Epsilon, rightState)); a.AddTransition(new Transition <int>(newRightState, Transition <int> .Epsilon, newLeftState)); ModifyAutomaat(reg.left, ref a, ref c, newLeftState, newRightState); }
private static Automaat <int> GetStartWithABB() { var a1 = new Automaat <int>(alphabet); a1.AddTransition(new Transition <int>(0, alphabet[0], 1)); a1.AddTransition(new Transition <int>(1, alphabet[1], 2)); a1.AddTransition(new Transition <int>(2, alphabet[1], 3)); a1.AddTransition(new Transition <int>(3, alphabet[0], 3)); a1.AddTransition(new Transition <int>(3, alphabet[1], 3)); a1.DefineAsStartState(0); a1.DefineAsFinalState(3); return(a1); }
static void PracL1Representatie2() { char[] alphabet = { 'a', 'b' }; Automaat <string> m = new Automaat <string>(alphabet); m.AddTransition(new Transition <string>("1", alphabet[0], "2")); m.AddTransition(new Transition <string>("1", alphabet[1], "3")); m.AddTransition(new Transition <string>("2", alphabet[0], "1")); m.AddTransition(new Transition <string>("2", alphabet[1], "5")); m.AddTransition(new Transition <string>("3", alphabet[0], "2")); m.AddTransition(new Transition <string>("3", alphabet[1], "4")); m.AddTransition(new Transition <string>("4", alphabet[0], "2")); m.AddTransition(new Transition <string>("4", alphabet[1], "4")); m.AddTransition(new Transition <string>("5", alphabet[0], "1")); m.AddTransition(new Transition <string>("5", alphabet[1], "4")); // only on start state in a dfa: m.DefineAsStartState("1"); // two final states: m.DefineAsFinalState("2"); m.DefineAsFinalState("4"); m.DefineAsFinalState("5"); List <Tuple <string, bool> > testWords = new List <Tuple <string, bool> >(); testWords.Add(new Tuple <string, bool>("a", true)); testWords.Add(new Tuple <string, bool>("bb", true)); testWords.Add(new Tuple <string, bool>("abb", true)); testWords.Add(new Tuple <string, bool>("aabb", true)); testWords.Add(new Tuple <string, bool>("baa", false)); testWords.Add(new Tuple <string, bool>("aabbabaaabab", true)); testWords.Add(new Tuple <string, bool>("ababaabaa", false)); testWords.Add(new Tuple <string, bool>("abba", true)); testWords.Add(new Tuple <string, bool>("babab", false)); testWords.Add(new Tuple <string, bool>("ababa", true)); TestingAutomaat("Bevat een even aantal b’s of bevat een oneven aantal a’s", m, testWords); var a = m.GeefTaal(3); Console.WriteLine("geaccepteerde woorden:"); a.ForEach(word => Console.WriteLine("\t" + word)); var b = m.GeefNietTaal(3); Console.WriteLine("niew geaccepteerde woorden:"); b.ForEach(word => Console.WriteLine("\t" + word)); }
static void TestSamenvoegen() { char[] alphabet = { 'a', 'b' }; var dfa1 = new Automaat <int>(alphabet); dfa1.AddTransition(new Transition <int>(1, alphabet[0], 2)); dfa1.AddTransition(new Transition <int>(1, alphabet[1], 1)); dfa1.AddTransition(new Transition <int>(2, alphabet[0], 1)); dfa1.AddTransition(new Transition <int>(2, alphabet[1], 2)); dfa1.DefineAsStartState(1); dfa1.DefineAsFinalState(1); var dfa2 = new Automaat <int>(alphabet); dfa2.AddTransition(new Transition <int>(1, alphabet[0], 1)); dfa2.AddTransition(new Transition <int>(1, alphabet[1], 2)); dfa2.AddTransition(new Transition <int>(2, alphabet[0], 1)); dfa2.AddTransition(new Transition <int>(2, alphabet[1], 3)); dfa2.AddTransition(new Transition <int>(3, alphabet[0], 1)); dfa2.AddTransition(new Transition <int>(3, alphabet[1], 4)); dfa2.AddTransition(new Transition <int>(4, alphabet[0], 4)); dfa2.AddTransition(new Transition <int>(4, alphabet[1], 4)); dfa2.DefineAsStartState(1); dfa2.DefineAsFinalState(1); dfa2.DefineAsFinalState(2); var notDfa1 = !dfa1; var notDfa2 = !dfa2; var and = dfa1 & dfa2; var or = dfa1 | dfa2; Graphviz.PrintGraph(and, "and"); var testWords = new List <Tuple <string, bool> >(); dfa1.GeefTaal(4).ForEach(s => testWords.Add(new Tuple <string, bool>(s, true))); dfa2.GeefTaal(4).ForEach(s => testWords.Add(new Tuple <string, bool>(s, true))); TestingAutomaat("And dfa", and, testWords); TestingAutomaat("Or dfa", or, testWords); }
public static void Regel1En2(RegExp reg, ref Automaat <int> a, ref int c, int leftState, int rightState) { var symbol = reg.terminals.First(); a._symbols.Add(symbol); a.AddTransition(new Transition <int>(leftState, symbol, rightState)); }
public Automaat <int> ToAutomaat() { var automaat = new Automaat <int>(Alphabet); foreach (var block in Blocks) { foreach (char c in Alphabet) { if (block.Rows.Count > 0) { automaat.AddTransition(new Transition <int>(block.Identifier, c, block.Rows[0].FindDestination(c).Identifier)); } } Automaat._startStates.ToList().ForEach(startstate => { block.States.ToList().ForEach(state => { if (state.Equals(startstate)) { automaat.DefineAsStartState(block.Identifier); } }); }); if (block.isFinalState) { automaat.DefineAsFinalState(block.Identifier); } } return(automaat); }
public Automaat <T> Reverse() { var reversedAutomaat = new Automaat <T>(_symbols); _startStates.ToList().ForEach(state => reversedAutomaat.DefineAsFinalState(state)); _finalStates.ToList().ForEach(state => reversedAutomaat.DefineAsStartState(state)); _transitions.ToList().ForEach(trans => reversedAutomaat.AddTransition(trans.Reverse())); return(reversedAutomaat); }
private static Automaat <int> BegintMet(string symbols, char[] alphabet) { var a = new Automaat <int>(alphabet); var stateCounter = 0; var wrongState = stateCounter++; var fromState = stateCounter; a.DefineAsStartState(fromState); foreach (var s in symbols.ToCharArray()) { stateCounter++; a.AddTransition(new Transition <int>(fromState, s, stateCounter)); foreach (var letter in a.GetAlphabet()) { if (s == letter) { continue; } a.AddTransition(new Transition <int>(fromState, letter, wrongState)); } fromState = stateCounter; } // on this point, the statecounter is the final state foreach (var s in a.GetAlphabet()) { a.AddTransition(new Transition <int>(wrongState, s)); a.AddTransition(new Transition <int>(stateCounter, s)); } a.DefineAsFinalState(stateCounter); return(a); }
static void PracL1Representatie3() { char[] alphabet = { 'a', 'b' }; Automaat <string> m = new Automaat <string>(alphabet); m.AddTransition(new Transition <string>("1", alphabet[0], "3")); m.AddTransition(new Transition <string>("1", alphabet[1], "2")); m.AddTransition(new Transition <string>("2", alphabet[0], "2")); m.AddTransition(new Transition <string>("2", alphabet[1], "1")); m.AddTransition(new Transition <string>("3", alphabet[0], "4")); m.AddTransition(new Transition <string>("3", alphabet[1], "2")); m.AddTransition(new Transition <string>("4", alphabet[0], "3")); m.AddTransition(new Transition <string>("4", alphabet[1], "5")); m.AddTransition(new Transition <string>("5", alphabet[0], "2")); m.AddTransition(new Transition <string>("5", alphabet[1], "1")); // only on start state in a dfa: m.DefineAsStartState("1"); // two final states: m.DefineAsFinalState("5"); List <Tuple <string, bool> > testWords = new List <Tuple <string, bool> >(); testWords.Add(new Tuple <string, bool>("aab", true)); testWords.Add(new Tuple <string, bool>("bbaab", true)); testWords.Add(new Tuple <string, bool>("bbbaab", false)); testWords.Add(new Tuple <string, bool>("aabaabaab", true)); testWords.Add(new Tuple <string, bool>("bbaabb", false)); testWords.Add(new Tuple <string, bool>("aabaab", false)); testWords.Add(new Tuple <string, bool>("ababaabaa", false)); TestingAutomaat("Bevat een even aantal b’s en eindigt op aab", m, testWords); }
private static void TestNdfaGraphviz() { var ndfa = new Automaat <string>(Alphabet); ndfa.AddTransition(new Transition <string>("0", Alphabet[0], "0")); ndfa.AddTransition(new Transition <string>("0", Alphabet[0], "1")); ndfa.AddTransition(new Transition <string>("0", Alphabet[1], "3")); ndfa.AddTransition(new Transition <string>("1", Alphabet[0], "1")); ndfa.AddTransition(new Transition <string>("1", Alphabet[1], "2")); ndfa.AddTransition(new Transition <string>("3", Alphabet[0])); ndfa.AddTransition(new Transition <string>("3", Alphabet[1])); ndfa.AddTransition(new Transition <string>("4", Alphabet[0], "1")); ndfa.AddTransition(new Transition <string>("4", Alphabet[1])); ndfa.DefineAsStartState("0"); ndfa.DefineAsStartState("4"); ndfa.DefineAsFinalState("2"); Graphviz.PrintGraph(ndfa, "ndfaTest"); }
private static Automaat <int> CombineAutomaat(Automaat <T> a1, Automaat <T> a2, Func <bool, bool, bool> finalstateDefine) { var combinedAutomaat = BetweenAutomaat(a1, a2); var newA = new Automaat <int>(combinedAutomaat.GetAlphabet()); combinedAutomaat._startStates.ToList().ForEach(state => newA.DefineAsStartState(state.Id)); combinedAutomaat._transitions.ToList().ForEach(trans => newA.AddTransition(new Transition <int>(trans.FromState.Id, trans.Symbol, trans.ToState.Id))); foreach (var state in combinedAutomaat._states) { if (finalstateDefine(a1.IsFinalState(state.StateAutomaat1), a2.IsFinalState(state.StateAutomaat2))) { newA.DefineAsFinalState(state.Id); } } return(newA); }
private static Automaat <int> BuildDfa <T>(Automaat <State <T> > stateAutomaat) where T : IComparable { var dfa = new Automaat <int>(stateAutomaat.GetAlphabet()); foreach (var startState in stateAutomaat._startStates) { dfa.DefineAsStartState(startState.Id); } foreach (var finalState in stateAutomaat._finalStates) { dfa.DefineAsFinalState(finalState.Id); } foreach (var trans in stateAutomaat._transitions) { dfa.AddTransition(new Transition <int>(trans.FromState.Id, trans.Symbol, trans.ToState.Id)); } if (!dfa.IsDfa()) { throw new Exception("Created dfa is not a dfa :("); } return(dfa); }
static void DfaToDfa() { //eindigd op 'aa' char[] alphabet = { 'a', 'b' }; var m = new Automaat <int>(alphabet); m.AddTransition(new Transition <int>(1, alphabet[0], 2)); m.AddTransition(new Transition <int>(1, alphabet[1], 1)); m.AddTransition(new Transition <int>(2, alphabet[0], 3)); m.AddTransition(new Transition <int>(2, alphabet[1], 1)); m.AddTransition(new Transition <int>(3, alphabet[0], 3)); m.AddTransition(new Transition <int>(3, alphabet[1], 1)); m.DefineAsStartState(1); m.DefineAsFinalState(3); NdfatoDfa.MakeDfa(m); }
static void NdfaToDfa() { char[] alphabet = { 'a', 'b' }; var m = new Automaat <int>(alphabet); m.AddTransition(new Transition <int>(0, Transition <int> .Epsilon, 1)); m.AddTransition(new Transition <int>(0, Transition <int> .Epsilon, 7)); m.AddTransition(new Transition <int>(1, Transition <int> .Epsilon, 2)); m.AddTransition(new Transition <int>(1, Transition <int> .Epsilon, 4)); m.AddTransition(new Transition <int>(2, alphabet[0], 3)); m.AddTransition(new Transition <int>(3, Transition <int> .Epsilon, 6)); m.AddTransition(new Transition <int>(4, alphabet[1], 5)); m.AddTransition(new Transition <int>(5, Transition <int> .Epsilon, 6)); m.AddTransition(new Transition <int>(6, Transition <int> .Epsilon, 7)); m.AddTransition(new Transition <int>(6, Transition <int> .Epsilon, 1)); m.AddTransition(new Transition <int>(7, alphabet[0], 8)); m.AddTransition(new Transition <int>(8, alphabet[1], 9)); m.AddTransition(new Transition <int>(9, alphabet[1], 10)); m.DefineAsStartState(0); m.DefineAsFinalState(10); var dfa = NdfatoDfa.MakeDfa(m); Graphviz.PrintGraph(m, "test"); dfa.PrintTransitions(); }
private static void BuildBetweenDfa <T>(ref Automaat <State <T> > a, SortedSet <Tuple <T, char, SortedSet <T> > > table, ref int stateCounter, State <T> s) where T : IComparable { foreach (var symbol in a._symbols) { var toStates = new SortedSet <T>(); foreach (var state in s.States) { foreach (var record in table) { if (record.Item1.CompareTo(state) == 0 && record.Item2 == symbol) { record.Item3.ToList().ForEach(toState => toStates.Add(toState)); } } } var transToState = s; var stateId = stateCounter; var stateExsists = false; if (toStates.Count == 0) { stateId = 0; foreach (var state in a._states) { if (state.Id == stateId) { stateExsists = true; transToState = state; break; } } } else { var isSameState = false; foreach (var state in a._states) { isSameState = state.HasSameStates(toStates); if (isSameState) { stateExsists = true; transToState = state; break; } } if (!isSameState) { stateCounter++; stateId = stateCounter; } } if (!stateExsists) { var newState = new State <T>(stateId) { States = toStates }; a.AddTransition(new Transition <State <T> >(s, symbol, newState)); BuildBetweenDfa(ref a, table, ref stateCounter, newState); } else { a.AddTransition(new Transition <State <T> >(s, symbol, transToState)); } } }
static void PracL1Representatie4() { char[] alphabet = { 'a', 'b' }; Automaat <string> m = new Automaat <string>(alphabet); m.AddTransition(new Transition <string>("1", alphabet[0], "2")); m.AddTransition(new Transition <string>("1", alphabet[1], "8")); m.AddTransition(new Transition <string>("2", alphabet[0], "8")); m.AddTransition(new Transition <string>("2", alphabet[1], "3")); m.AddTransition(new Transition <string>("3", alphabet[0], "8")); m.AddTransition(new Transition <string>("3", alphabet[1], "4")); m.AddTransition(new Transition <string>("4", alphabet[0], "5")); m.AddTransition(new Transition <string>("4", alphabet[1], "4")); m.AddTransition(new Transition <string>("5", alphabet[0], "6")); m.AddTransition(new Transition <string>("5", alphabet[1], "4")); m.AddTransition(new Transition <string>("6", alphabet[0], "4")); m.AddTransition(new Transition <string>("6", alphabet[1], "7")); m.AddTransition(new Transition <string>("7", alphabet[0], "7")); m.AddTransition(new Transition <string>("7", alphabet[1], "7")); m.AddTransition(new Transition <string>("8", alphabet[0], "8")); m.AddTransition(new Transition <string>("8", alphabet[1], "8")); // only one start state in a dfa: m.DefineAsStartState("1"); // two final states: m.DefineAsFinalState("7"); List <Tuple <string, bool> > testWords = new List <Tuple <string, bool> >(); testWords.Add(new Tuple <string, bool>("abbaabababab", true)); testWords.Add(new Tuple <string, bool>("abbaab", true)); testWords.Add(new Tuple <string, bool>("abb", false)); testWords.Add(new Tuple <string, bool>("abaab", false)); testWords.Add(new Tuple <string, bool>("ababaaba", false)); TestingAutomaat("Begint met abb en bevat baab", m, testWords); }
private static Automaat <int> GetEndWithABB() { var a1 = new Automaat <int>(alphabet); a1.AddTransition(new Transition <int>(0, Transition <int> .Epsilon, 1)); a1.AddTransition(new Transition <int>(0, Transition <int> .Epsilon, 7)); a1.AddTransition(new Transition <int>(1, Transition <int> .Epsilon, 2)); a1.AddTransition(new Transition <int>(1, Transition <int> .Epsilon, 4)); a1.AddTransition(new Transition <int>(2, alphabet[0], 3)); a1.AddTransition(new Transition <int>(3, Transition <int> .Epsilon, 6)); a1.AddTransition(new Transition <int>(4, alphabet[1], 5)); a1.AddTransition(new Transition <int>(5, Transition <int> .Epsilon, 6)); a1.AddTransition(new Transition <int>(6, Transition <int> .Epsilon, 7)); a1.AddTransition(new Transition <int>(7, alphabet[0], 8)); a1.AddTransition(new Transition <int>(6, Transition <int> .Epsilon, 1)); a1.AddTransition(new Transition <int>(8, alphabet[1], 9)); a1.AddTransition(new Transition <int>(9, alphabet[1], 10)); a1.DefineAsStartState(0); a1.DefineAsFinalState(10); return(a1); }
private static Automaat <int> GetStartAbbOrEndBaab() { char[] alphabet = { 'a', 'b' }; Automaat <int> m = new Automaat <int>(alphabet); m.AddTransition(new Transition <int>(1, 'a', 2)); m.AddTransition(new Transition <int>(1, 'b', 5)); m.AddTransition(new Transition <int>(2, 'a', 9)); m.AddTransition(new Transition <int>(2, 'b', 3)); m.AddTransition(new Transition <int>(3, 'a', 6)); m.AddTransition(new Transition <int>(3, 'b', 4)); m.AddTransition(new Transition <int>(4, 'a', 4)); m.AddTransition(new Transition <int>(4, 'b', 4)); m.AddTransition(new Transition <int>(5, 'a', 6)); m.AddTransition(new Transition <int>(5, 'b', 5)); m.AddTransition(new Transition <int>(6, 'a', 7)); m.AddTransition(new Transition <int>(6, 'b', 5)); m.AddTransition(new Transition <int>(7, 'a', 9)); m.AddTransition(new Transition <int>(7, 'b', 8)); m.AddTransition(new Transition <int>(8, 'a', 6)); m.AddTransition(new Transition <int>(8, 'b', 5)); m.AddTransition(new Transition <int>(9, 'a', 9)); m.AddTransition(new Transition <int>(9, 'b', 5)); m.DefineAsStartState(1); m.DefineAsFinalState(4); m.DefineAsFinalState(8); return(m); }
static void TestOptimizingDfa() { char[] alphabet = { 'a', 'b' }; var m = new Automaat <string>(alphabet); m.AddTransition(new Transition <string>("0", alphabet[0], "2")); m.AddTransition(new Transition <string>("0", alphabet[1], "3")); m.AddTransition(new Transition <string>("1", alphabet[0], "3")); m.AddTransition(new Transition <string>("1", alphabet[1], "2")); m.AddTransition(new Transition <string>("2", alphabet[0], "0")); m.AddTransition(new Transition <string>("2", alphabet[1], "4")); m.AddTransition(new Transition <string>("3", alphabet[0], "1")); m.AddTransition(new Transition <string>("3", alphabet[1], "5")); m.AddTransition(new Transition <string>("4", alphabet[0], "6")); m.AddTransition(new Transition <string>("4", alphabet[1], "5")); m.AddTransition(new Transition <string>("5", alphabet[0], "2")); m.AddTransition(new Transition <string>("5", alphabet[1], "0")); m.AddTransition(new Transition <string>("6", alphabet[0], "4")); m.AddTransition(new Transition <string>("6", alphabet[1], "0")); m.DefineAsStartState("0"); m.DefineAsFinalState("1"); m.DefineAsFinalState("3"); m.DefineAsFinalState("4"); m.DefineAsFinalState("6"); var testWords = new List <Tuple <string, bool> >(); testWords.Add(new Tuple <string, bool>("b", true)); testWords.Add(new Tuple <string, bool>("ba", true)); testWords.Add(new Tuple <string, bool>("bab", false)); testWords.Add(new Tuple <string, bool>("bba", false)); testWords.Add(new Tuple <string, bool>("babb", true)); TestingAutomaat("Testing not optimized automaat", m, testWords); }
static void TestMinimize() { char[] alphabet = { 'a', 'b' }; var m = new Automaat <string>(alphabet); m.AddTransition(new Transition <string>("0", alphabet[0], "0")); m.AddTransition(new Transition <string>("0", alphabet[1], "1")); m.AddTransition(new Transition <string>("1", alphabet[0], "2")); m.AddTransition(new Transition <string>("1", alphabet[1], "1")); m.AddTransition(new Transition <string>("2", alphabet[0], "0")); m.AddTransition(new Transition <string>("2", alphabet[1], "3")); m.AddTransition(new Transition <string>("3", alphabet[0], "4")); m.AddTransition(new Transition <string>("3", alphabet[1], "1")); m.AddTransition(new Transition <string>("4", alphabet[0], "5")); m.AddTransition(new Transition <string>("4", alphabet[1], "3")); m.AddTransition(new Transition <string>("5", alphabet[0], "0")); m.AddTransition(new Transition <string>("5", alphabet[1], "3")); m.DefineAsStartState("0"); m.DefineAsFinalState("2"); m.DefineAsFinalState("4"); Console.WriteLine("first automate:"); m.PrintTransitions(); var minimized = m.MinimizeHopCroft(true); Console.WriteLine("minimized automate:"); minimized.PrintTransitions(); var otherMinimized = m.MinimizeReverse(); Console.WriteLine("other minimization:"); otherMinimized.PrintTransitions(); }