示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }
示例#4
0
        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();
        }
示例#5
0
        public bool CheckForDuplicateStates(Automata <T> automata, string delta)
        {
            foreach (var state in automata.states)
            {
                if (state.Equals(delta))
                {
                    return(true);
                }
            }

            return(false);
        }
示例#6
0
        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);
        }
示例#7
0
        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();
        }
示例#8
0
        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);
        }
示例#9
0
 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)));
     }
 }
示例#10
0
        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);
        }
示例#11
0
        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);
        }
示例#12
0
        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);
        }
示例#13
0
        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);
        }
示例#14
0
        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);
        }
示例#15
0
        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);
        }
示例#16
0
        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);
        }