예제 #1
0
        /// <summary>
        /// bevat een even aantal b’s en eindigt op aab
        /// </summary>
        /// <returns></returns>
        static public Automata <string> EvenbEindigaab()
        {
            char[]            alphabet = { 'a', 'b' };
            Automata <string> automata = new Automata <string>(alphabet);

            automata.AddTransition(new Transition <string>("0", 'a', "0"));
            automata.AddTransition(new Transition <string>("0", 'b', "1"));

            automata.AddTransition(new Transition <string>("1", 'a', "2"));
            automata.AddTransition(new Transition <string>("1", 'b', "0"));

            automata.AddTransition(new Transition <string>("2", 'a', "3"));
            automata.AddTransition(new Transition <string>("2", 'b', "0"));

            automata.AddTransition(new Transition <string>("3", 'a', "2"));
            automata.AddTransition(new Transition <string>("3", 'b', "4"));

            automata.AddTransition(new Transition <string>("4", 'a', "2"));
            automata.AddTransition(new Transition <string>("4", 'b', "0"));

            automata.DefineAsStartState("0");

            automata.DefineAsFinalState("4");

            return(automata);
        }
예제 #2
0
        static public Automata <string> GetExampleSlide14Lesson2()
        {
            char[]            alphabet = { 'a', 'b' };
            Automata <string> automata = new Automata <string>(alphabet);

            automata.AddTransition(new Transition <string>("A", 'a', "C"));
            automata.AddTransition(new Transition <string>("A", 'b', "B"));
            automata.AddTransition(new Transition <string>("A", 'b', "C"));

            automata.AddTransition(new Transition <string>("B", 'b', "C"));
            automata.AddTransition(new Transition <string>("B", "C"));

            automata.AddTransition(new Transition <string>("C", 'a', "D"));
            automata.AddTransition(new Transition <string>("C", 'a', "E"));
            automata.AddTransition(new Transition <string>("C", 'b', "D"));

            automata.AddTransition(new Transition <string>("D", 'a', "B"));
            automata.AddTransition(new Transition <string>("D", 'a', "C"));

            automata.AddTransition(new Transition <string>("E", 'a'));
            automata.AddTransition(new Transition <string>("E", "D"));

            // only on start state in a dfa:
            automata.DefineAsStartState("A");

            // two final states:
            automata.DefineAsFinalState("C");
            automata.DefineAsFinalState("E");

            return(automata);
        }
예제 #3
0
        static public Automata <string> GetExampleSlide8Lesson2()
        {
            char[]            alphabet = { 'a', 'b' };
            Automata <string> automata = new Automata <string>(alphabet);

            automata.AddTransition(new Transition <string>("q0", 'a', "q1"));
            automata.AddTransition(new Transition <string>("q0", 'b', "q4"));

            automata.AddTransition(new Transition <string>("q1", 'a', "q4"));
            automata.AddTransition(new Transition <string>("q1", 'b', "q2"));

            automata.AddTransition(new Transition <string>("q2", 'a', "q3"));
            automata.AddTransition(new Transition <string>("q2", 'b', "q4"));

            automata.AddTransition(new Transition <string>("q3", 'a', "q1"));
            automata.AddTransition(new Transition <string>("q3", 'b', "q2"));

            // the error state, loops for a and b:
            automata.AddTransition(new Transition <string>("q4", 'a'));
            automata.AddTransition(new Transition <string>("q4", 'b'));

            // only on start state in a dfa:
            automata.DefineAsStartState("q0");

            // two final states:
            automata.DefineAsFinalState("q2");
            automata.DefineAsFinalState("q3");

            return(automata);
        }
예제 #4
0
        /// <summary>
        /// Schrijf Automata naar een dot file voor graphviz
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="automata"></param>
        /// <param name="filename"></param>
        /// <param name="path">Moet eindigen op / als het geen lege string is</param>
        /// <param name="leftRight">default zal de graph van boven naar beneden worden getekend</param>
        public void WriteToDotFile <T>(Automata <T> automata, string filename, string path = "", bool leftRight = false) where T : IComparable
        {
            Dictionary <T, int> labels = new Dictionary <T, int>();

            for (int i = 1; i < automata.States.Count + 1; i++)
            {
                labels.Add(automata.States.ElementAt(i - 1), i);
            }

            using (StreamWriter writer = new StreamWriter($"{path}{filename}.dot"))
            {
                writer.WriteLine("digraph dfa {");

                if (leftRight)
                {
                    writer.WriteLine("rankdir=LR;");
                }

                //Labels
                writer.WriteLine(@"NOTHING [label="""", shape=none]");
                foreach (var label in labels)
                {
                    if (automata.StartStates.Contains(label.Key) && automata.FinalStates.Contains(label.Key))
                    {
                        writer.WriteLine($@"{label.Value} [label=""{label.Key}"", shape=ellipse, style=filled, color=green]");
                    }
                    else if (automata.StartStates.Contains(label.Key))
                    {
                        writer.WriteLine($@"{label.Value} [label=""{label.Key}"", shape=ellipse, style=filled, color=lightblue]");
                    }
                    else if (automata.FinalStates.Contains(label.Key))
                    {
                        writer.WriteLine($@"{label.Value} [label=""{label.Key}"", shape=ellipse, style=filled, color=yellowgreen]");
                    }
                    else
                    {
                        writer.WriteLine($@"{label.Value} [label=""{label.Key}"", shape=ellipse, style=filled]");
                    }
                }

                //Transitions
                foreach (var state in automata.StartStates)
                {
                    writer.WriteLine($"NOTHING -> {labels[state]}");
                }
                foreach (var transition in automata.Transitions)
                {
                    int from = labels[transition.FromState];
                    int to   = labels[transition.ToState];
                    writer.WriteLine($@"{from} -> {to} [label=""{transition.Symbol}""]");
                }

                writer.WriteLine("}");
            }
        }
예제 #5
0
        /// <summary>
        /// begint met abb of eindigt op baab
        /// </summary>
        /// <returns></returns>
        static public Automata <string> BeginabbOfEindingbaab()
        {
            char[]            alphabet = { 'a', 'b' };
            Automata <string> automata = new Automata <string>(alphabet);

            automata.AddTransition(new Transition <string>("0", 'a', "1"));
            automata.AddTransition(new Transition <string>("0", 'b', "4"));

            automata.AddTransition(new Transition <string>("1", 'a', "4"));
            automata.AddTransition(new Transition <string>("1", 'b', "2"));

            automata.AddTransition(new Transition <string>("2", 'a', "4"));
            automata.AddTransition(new Transition <string>("2", 'b', "3"));

            automata.AddTransition(new Transition <string>("3", 'a', "3"));
            automata.AddTransition(new Transition <string>("3", 'b', "3"));

            automata.AddTransition(new Transition <string>("4", 'a', "4"));
            automata.AddTransition(new Transition <string>("4", 'b', "5"));

            automata.AddTransition(new Transition <string>("5", 'a', "6"));
            automata.AddTransition(new Transition <string>("5", 'b', "5"));

            automata.AddTransition(new Transition <string>("6", 'a', "7"));
            automata.AddTransition(new Transition <string>("6", 'b', "5"));

            automata.AddTransition(new Transition <string>("7", 'a', "4"));
            automata.AddTransition(new Transition <string>("7", 'b', "8"));

            automata.AddTransition(new Transition <string>("8", 'a', "4"));
            automata.AddTransition(new Transition <string>("8", 'b', "5"));

            automata.DefineAsStartState("0");

            automata.DefineAsFinalState("3");
            automata.DefineAsFinalState("8");

            return(automata);
        }