Beispiel #1
0
        private void button3_Click(object sender, EventArgs e)
        {
            OpenFileDialog opf = new OpenFileDialog();

            textBox3.Clear();
            textBox4.Clear();
            richTextBox1.Clear();
            newDfa = new DfaReader();
            opf.InitialDirectory = Assembly.GetExecutingAssembly().Location;
            opf.RestoreDirectory = true;
            opf.Filter           = "txt files (*.txt)|*.txt";
            if (opf.ShowDialog() == DialogResult.OK)
            {
                fileName = opf.FileName;
            }
            try
            {
                myDfa.FillDfa(fileName);
                newDfa = myDfa.MiniDfa();
                richTextBox1.Clear();
                textBox4.Text     = "Input word with " + newDfa.Alphabet[0] + "," + newDfa.Alphabet[1];
                richTextBox1.Text = newDfa.printDfa();
            }
            catch
            {
                MessageBox.Show("Something went wrong", "Attention");
            }
        }
Beispiel #2
0
        public DfaReader MiniDfa() // минимизирует дфа
        {
            char[,] table;
            int[]    intNumbers;
            string[] NewNumbers;
            int[,] NewTransition;
            bool[]    newEnd;
            DfaReader newDfa = new DfaReader();

            newDfa.Alphabet = Alphabet;
            table           = new char[Numbers.Length, Numbers.Length];

            for (int i = 0; i < Numbers.Length; i++)// заполняет всю табл +
            {
                for (int j = 0; j < Numbers.Length; j++)
                {
                    table[i, j] = '+';
                }
            }

            for (int i = 0; i < Numbers.Length; i++)//решотки ниже главной и доллары на глав диагонал
            {
                table[i, i] = '$';
                for (int j = 0; j < i; j++)
                {
                    table[i, j] = '#';
                }
            }

            for (int i = 0; i < Numbers.Length; i++) // декартовое произведение, раставляет звездочки на пересеч. кон. и некон. сост.
            {
                if (End[i] == true)
                {
                    for (int j = 0; j < Numbers.Length; j++)
                    {
                        if (!End[j] && i < j)
                        {
                            table[i, j] = '*';
                        }
                        if (!End[j] && j < i)
                        {
                            table[j, i] = '*';
                        }
                    }
                }
            }
            //////////////////////
            int count = 0;

            do // в пустых(+) клетках ставит * или доллар в соответ с правилами:если оба бакс  ставим бакс, если хоть 1 * ставим *
            {
                int k = 0, l = 0, m = 0, n = 0;
                count = 0;
                for (int i = 0; i < Numbers.Length; i++)
                {
                    for (int j = 0; j < Numbers.Length; j++)
                    {
                        if (table[i, j] == '+')
                        {
                            for (int s = 0; s < Numbers.Length; s++)
                            {
                                if (Transition[i, 0] == Numbers[s])
                                {
                                    k = s;
                                }
                                if (Transition[i, 1] == Numbers[s])
                                {
                                    l = s;
                                }
                                if (Transition[j, 0] == Numbers[s])
                                {
                                    m = s;
                                }
                                if (Transition[j, 1] == Numbers[s])
                                {
                                    n = s;
                                }
                            }
                            if ((table[k, m] == '$' && table[l, n] == '$') || (table[m, k] == '$' && table[l, n] == '$') || (table[k, m] == '$' && table[n, l] == '$') || (table[m, k] == '$' && table[n, l] == '$'))
                            {
                                table[i, j] = '$';
                                count++;
                            }
                            if (table[k, m] == '*' || table[l, n] == '*' || table[m, k] == '*' || table[n, l] == '*')
                            {
                                table[i, j] = '*';
                                count++;
                            }
                        }
                    }
                }
            }while (count != 0);
            ///////////////////
            ///
            NewNumbers = new string[Numbers.Length];
            for (int i = 0, n = 0; i < Numbers.Length; i++, n++)// составляем новые имена состояний для конкатанаци строк
            {
                string temp    = "";
                int    counter = 0;
                for (int j = 0; j < Numbers.Length; j++)
                {
                    if (table[i, j] == '$')
                    {
                        temp += Numbers[j].ToString();
                        counter++;
                    }
                }
                NewNumbers[n] = temp;
            }

            string[] tempNumbers = NewNumbers;

            for (int i = 0; i < Numbers.Length; i++)//вытерает все одинаковые состояния
            {
                for (int j = 0; j < Numbers.Length; j++)
                {
                    for (int k = 0; k < NewNumbers[j].Length; k++)
                    {
                        if (NewNumbers[i].Contains(tempNumbers[j][k]) && i != j)
                        {
                            NewNumbers[i] += tempNumbers[j];
                            NewNumbers[j]  = "";
                        }
                    }
                }
            }

            NewNumbers = NewNumbers.Where(i => i != "").ToArray();
            intNumbers = new int[NewNumbers.Length];
            newEnd     = new bool[NewNumbers.Length];

            for (int i = 0; i < NewNumbers.Length; i++)//определяет кон сост в новом дфа
            {
                intNumbers[i] = Convert.ToInt32(NewNumbers[i][0].ToString());
                for (int k = 0; k < Numbers.Length; k++)
                {
                    if (NewNumbers[i].Contains(Numbers[k].ToString()))
                    {
                        if (End[k] == true)
                        {
                            newEnd[i] = true;
                        }
                    }
                }
            }

            NewTransition = new int[NewNumbers.Length, Alphabet.Length];

            for (int i = 0; i < NewNumbers.Length; i++)//определ новые переходы
            {
                for (int j = 0; j < Numbers.Length; j++)
                {
                    if (NewNumbers[i].Contains(Numbers[j].ToString()))
                    {
                        NewTransition[i, 0] = Transition[j, 0];
                        NewTransition[i, 1] = Transition[j, 1];
                    }
                }
            }

            int[,] tempTr = NewTransition;
            for (int i = 0; i < NewNumbers.Length; i++)//дает новым переходам соотв имена
            {
                for (int j = 0; j < NewNumbers.Length; j++)
                {
                    if (NewNumbers[i].Contains(Convert.ToString(tempTr[j, 0])))
                    {
                        NewTransition[j, 0] = intNumbers[i];
                    }
                    if (NewNumbers[i].Contains(Convert.ToString(tempTr[j, 1])))
                    {
                        NewTransition[j, 1] = intNumbers[i];
                    }
                }
            }
            newDfa.Numbers    = intNumbers;
            newDfa.Transition = NewTransition;
            newDfa.End        = newEnd;
            return(newDfa);
        }