public Automata <T> ToDfaHelper(List <T> delta, Automata <T> automata) { foreach (var symbol in symbols) { var delta2 = Delta(delta, symbol); string deltaString = string.Join(",", delta); string delta2String = string.Join(",", delta2); if (IsEndState(delta2)) { automata.endStates.Add(GetValue <T>(delta2String)); } if (IsEndState(delta)) { automata.endStates.Add(GetValue <T>(deltaString)); } if (CheckForDuplicateStates(automata, delta2String)) { AddCheckedTransition(automata, deltaString, delta2String, symbol); } else { AddCheckedTransition(automata, deltaString, delta2String, symbol); ToDfaHelper(delta2, automata); } } return(automata); }
public static Automata <string> GetExampleSlide8Lesson2() { char[] alphabet = { 'a', 'b' }; Automata <string> m = new Automata <string>(alphabet); m.AddTransition(new Transition <string>("q0", 'a', "q1")); m.AddTransition(new Transition <string>("q0", 'b', "q4")); m.AddTransition(new Transition <string>("q1", 'a', "q4")); m.AddTransition(new Transition <string>("q1", 'b', "q2")); m.AddTransition(new Transition <string>("q2", 'a', "q3")); m.AddTransition(new Transition <string>("q2", 'b', "q4")); m.AddTransition(new Transition <string>("q3", 'a', "q1")); m.AddTransition(new Transition <string>("q3", 'b', "q2")); m.AddTransition(new Transition <string>("q4", 'a')); m.AddTransition(new Transition <string>("q4", 'b')); m.DefineAsStartState("q0"); m.DefineAsFinalState("q2"); m.DefineAsFinalState("q3"); return(m); }
public static Automata <String> GetExampleSlide14Lesson2() { char[] alphabet = { 'a', 'b' }; Automata <string> m = new Automata <string>(alphabet); m.AddTransition(new Transition <String>("A", 'a', "C")); m.AddTransition(new Transition <String>("A", 'b', "B")); m.AddTransition(new Transition <String>("A", 'b', "C")); m.AddTransition(new Transition <String>("B", 'b', "C")); m.AddTransition(new Transition <String>("B", "C")); m.AddTransition(new Transition <String>("C", 'a', "D")); m.AddTransition(new Transition <String>("C", 'a', "E")); m.AddTransition(new Transition <String>("C", 'b', "D")); m.AddTransition(new Transition <String>("D", 'a', "B")); m.AddTransition(new Transition <String>("D", 'a', "C")); m.AddTransition(new Transition <String>("E", 'a')); m.AddTransition(new Transition <String>("E", "D")); // only on start state in a dfa: m.DefineAsStartState("A"); // two final states: m.DefineAsFinalState("C"); m.DefineAsFinalState("E"); return(m); }
public static void PrintLanguageTillLength(Automata <string> m, int length) { SortedSet <string> language = m.ReturnLanguageTillLength(length); foreach (string s in language) { Console.Write(s + " "); } Console.WriteLine(); }
public bool CheckForDuplicateStates(Automata <T> automata, string delta) { foreach (var state in automata.states) { if (state.Equals(delta)) { return(true); } } return(false); }
public static void TestRegRam(Automata <string> m) { RegGram regGram = new RegGram(m.getTransitions, m.getEndStates); regGram.Print(); Console.WriteLine(); string[] lines = { "S -> aA", "A -> aS | b" }; RegGram newgram = new RegGram(lines); Automata <string> m2 = newgram.CreateAutomata(); newgram.PrintTransitions(m2.getTransitions); }
static void Main(string[] args) { Automata <string> m1 = Test.GetExampleSlide8Lesson2(); m1.PrintTransitions(); Console.WriteLine("isDFA: " + m1.IsDFA()); Console.WriteLine("Accept: " + m1.Accept("abababab")); Test.PrintLanguageTillLength(m1, 5); m1.CreateGraph("1_graph2"); Console.WriteLine(); Console.WriteLine(); Automata <string> m2 = Test.GetExampleSlide14Lesson2(); m2.PrintTransitions(); Test.PrintLanguageTillLength(m2, 5); Console.WriteLine("isDFA: " + m2.IsDFA()); Console.WriteLine("Accept: " + m2.Accept("aab")); m2.CreateGraph("1_graph1"); Test.TestRegExp(); Test.TestRegRam(m2); var m = Test.NdfaToDFa(); m.CreateGraph("2_NDFA"); m.Reverse().CreateGraph("2_NdfaReverse"); m.ToDFA().CreateGraph("2_DFA"); m.ToDFA().Reverse().CreateGraph("2_Reverse"); m.ToDFA().CreateGraph("2_Minimalised"); var m3 = Test.MinimalizationAutomata(); m3.CreateGraph("3_MinimalisationAutomata"); m3.Reverse().CreateGraph("3_Reversed"); m3.Minimalise().CreateGraph("3_DoneMinimalization"); var m4 = Test.NDfaToDfa2(); m4.CreateGraph("5_NDFA"); m4.ToDFA().CreateGraph("5_DFA"); m4.ToDFA().Reverse().CreateGraph("5_DFA_REV"); m4.ToDFA().Minimalise().CreateGraph("5_DFA_MIN"); var m5 = Test.TestAutomata2(); m5.CreateGraph("6_DFA"); m5.Reverse().CreateGraph("6_MIN"); m5.Reverse().ToDFA().CreateGraph("6_REV_DFA"); Console.ReadKey(); }
public Automata <string> CreateAutomata() { char finalState = _lines.Last().First(); finalState++; string finalStateString = finalState.ToString(); Automata <string> m = new Automata <string>(); m.DefineAsStartState(_lines[0].First().ToString()); List <char> symbols = new List <char>(); foreach (string line in _lines) { string[] substrings = line.Split(' '); string fromState = substrings[0]; for (int i = 2; i < substrings.Length; i += 2) { string substring = substrings[i]; char symbol = substring.First(); if (symbol != '$' && !symbols.Contains(symbol)) { symbols.Add(symbol); } if (substring.Length > 1) { string toState = substring[1].ToString(); if (substring.Last() == '*') { m.DefineAsFinalState(toState); } m.AddTransition(new Transition <string>(fromState, symbol, toState)); } else { m.AddTransition(new Transition <string>(fromState, symbol, finalStateString)); if (!m.getEndStates.Contains(finalStateString)) { m.DefineAsFinalState(finalStateString); } } } } m.SetAlphabet(symbols.ToArray()); return(m); }
private void AddCheckedTransition(Automata <T> automata, string from, string to, char symbol) { if (from.Length > 0 && to.Length == 0) { automata.AddTransition(new Transition <T>(GetValue <T>(from), symbol, GetValue <T>("FUIK"))); } else if (from.Length == 0 && to.Length == 0) { return; } else { automata.AddTransition(new Transition <T>(GetValue <T>(from), symbol, GetValue <T>(to))); } }
public static Automata <string> TestAutomata2() { char[] alphabet = { '0', '1' }; Automata <string> m = new Automata <string>(alphabet); m.AddTransition(new Transition <string>("q0", '0', "q0")); m.AddTransition(new Transition <string>("q0", '1', "q1")); m.AddTransition(new Transition <string>("q1", '0', "q0")); m.AddTransition(new Transition <string>("q1", '1', "q1")); m.DefineAsFinalState("q0"); m.DefineAsFinalState("q1"); m.DefineAsStartState("q0"); return(m); }
public Automata <T> Reverse() { SortedSet <T> temp = startStates; Automata <T> m = (Automata <T>) this.MemberwiseClone(); m.startStates = m.endStates; m.endStates = temp; var tempTransitions = m.transitions.Select(transition => { return(new Transition <T>(transition.toState, transition.symbol, transition.fromState)); }).ToList(); m.transitions = new SortedSet <Transition <T> >(from x in tempTransitions select x, new TransitionComparator <T>()); return(m); }
public Automata <string> ToAutomata() { char[] alphabet = { 'a', 'b' }; Automata <string> automata = new Automata <string>(alphabet); automata.DefineAsStartState("S"); automata.DefineAsFinalState("F"); var left = this.GetTransitions("S", "F"); foreach (var transition in left) { automata.AddTransition(transition); } Counter = 'A'; return(automata); }
public static Automata <string> NDfaToDfa2() { char[] alphabet = { '0', '1' }; Automata <string> m = new Automata <string>(alphabet); m.AddTransition(new Transition <string>("a", '0', "a")); m.AddTransition(new Transition <string>("a", '0', "d")); m.AddTransition(new Transition <string>("a", '1', "d")); m.AddTransition(new Transition <string>("a", '0', "e")); m.AddTransition(new Transition <string>("a", '1', "e")); m.AddTransition(new Transition <string>("d", '0', "e")); m.AddTransition(new Transition <string>("a", '0', "b")); m.AddTransition(new Transition <string>("a", '0', "c")); m.AddTransition(new Transition <string>("c", '1', "b")); m.AddTransition(new Transition <string>("b", '0', "c")); m.AddTransition(new Transition <string>("b", '1', "e")); m.DefineAsFinalState("e"); m.DefineAsStartState("a"); return(m); }
public Automata <T> ToDFA() { if (this.IsDFA()) { return((Automata <T>) this.MemberwiseClone()); } Automata <T> automata = new Automata <T>(this.symbols); automata.states.Add(GetValue <T>("")); foreach (var startState in startStates) { List <T> eclosure = EClosure(startState); string eclosureString = string.Join(",", eclosure); if (IsEndState(eclosure)) { automata.endStates.Add(GetValue <T>(eclosureString)); } automata.DefineAsStartState(GetValue <T>(eclosureString)); foreach (var symbol in symbols) { List <T> delta = Delta(eclosure, symbol); string deltaString = string.Join(",", delta); if (IsEndState(delta)) { automata.endStates.Add(GetValue <T>(deltaString)); } AddCheckedTransition(automata, eclosureString, deltaString, symbol); automata = ToDfaHelper(delta, automata); } } return(automata); }
public static Automata <string> MinimalizationAutomata() { char[] alphabet = { 'a', 'b' }; Automata <string> m = new Automata <string>(alphabet); m.AddTransition(new Transition <string>("0", 'a', "0")); m.AddTransition(new Transition <string>("0", 'b', "1")); m.AddTransition(new Transition <string>("1", 'a', "2")); m.AddTransition(new Transition <string>("1", 'b', "1")); m.AddTransition(new Transition <string>("2", 'a', "0")); m.AddTransition(new Transition <string>("2", 'b', "3")); m.AddTransition(new Transition <string>("3", 'a', "4")); m.AddTransition(new Transition <string>("3", 'b', "1")); m.AddTransition(new Transition <string>("4", 'b', "3")); m.AddTransition(new Transition <string>("4", 'a', "5")); m.AddTransition(new Transition <string>("5", 'a', "0")); m.AddTransition(new Transition <string>("5", 'b', "3")); m.DefineAsStartState("0"); m.DefineAsFinalState("4"); m.DefineAsFinalState("2"); return(m); }
public static Automata <string> NdfaToDFa() { char[] alphabet = { 'a', 'b' }; Automata <string> m = new Automata <string>(alphabet); m.AddTransition(new Transition <string>("0", '$', "1")); m.AddTransition(new Transition <string>("0", '$', "7")); m.AddTransition(new Transition <string>("1", '$', "2")); m.AddTransition(new Transition <string>("1", '$', "4")); m.AddTransition(new Transition <string>("2", 'a', "3")); m.AddTransition(new Transition <string>("4", 'b', "5")); m.AddTransition(new Transition <string>("3", '$', "6")); m.AddTransition(new Transition <string>("5", '$', "6")); m.AddTransition(new Transition <string>("6", '$', "1")); m.AddTransition(new Transition <string>("6", '$', "7")); m.AddTransition(new Transition <string>("7", 'a', "8")); m.AddTransition(new Transition <string>("8", 'b', "9")); m.AddTransition(new Transition <string>("9", 'b', "10")); m.DefineAsStartState("0"); m.DefineAsFinalState("10"); return(m); }