Пример #1
0
        public static Dictionary <string, string> Encode(string[] states)
        {
            Dictionary <string, string> dic = new Dictionary <string, string>();

            string[] codes = new string[states.Length];

            int length = (int)Math.Ceiling(Math.Log(states.Length, 2));

            for (int i = 0; i < states.Length; i++)
            {
                codes[i] = TuringToPost.getCode(i, length, states[i]);
            }

            TuringToPost.improveSpaceCode(codes, states);

            for (int i = 0; i < states.Length; i++)
            {
                dic.Add(states[i], codes[i]);
            }

            return(dic);
        }
Пример #2
0
        public string[,] GeneratePostProgram()
        {
            TuringToPost t = new TuringToPost(codes[this.Alphabet[0]].Length);
            List<int> st = new List<int>(); // индексы состояний
            List<int> refern = new List<int>(); //индексы, в которые будем пихать отсылки

            int fir = this.Table.Length; // колв-о комманд (строк в таблице)
            int sec = this.Table[0].Length; // 3 по идее
            int thi = this.Table[0][0].Length; // кол-во столбцов
            for(int i=0; i<fir; i++) // генерим программу без отсылок
            {
                st.Add(t.Prog.Count + 1); // добавляем индекс состояния

                for(int j=0; j<thi; j++)
                {
                    if (Table[i][0][j] == "" && Table[i][1][j] == "") continue; // если состояние не описано

                    string alph = codes[Alphabet[j]],
                           stt = codes[Table[i][0][j]],
                           mover = Table[i][1][j];

                    int count = this.calcStLen(alph, stt, mover); // длина для неудачной отсылки

                    // неверные отсылки, длину надо прибавлять к текущему состоянию
                    t.Check(alph, t.Prog.Count + 3 * t.Length + 1, t.Prog.Count + count + 1);

                    t.Replace(alph, stt);

                    if (mover == "r")
                        t.MoveRight();
                    else
                        if (mover == "l")
                            t.MoveLeft();
                        else
                            if (mover == "halt")
                            t.Stop();

                     refern.Add(t.Prog.Count - 1);
                }
            }

               t.Stop(); // остановка в конце по сут не нужна, но последняя отсылка указывает на несуществующую команду

            for (int i = 0, k = 0; i < fir; i++) // генерим отсылки
            {

                for (int j = 0; j < thi; j++)
                {
                    if (this.Table[i][2][j] == "") continue;

                    int statind = this.DicStates[this.Table[i][2][j]];
                    int what = refern[k++];
                    int where = st[statind];
                    if (t.Prog[what][0] != PostCommands.Stop)
                    t.Prog[what][1] = where.ToString();
                }
            }

            string[,] outst = new string[t.Prog.Count, t.Prog[0].Length];
            for (int i = 0; i < outst.GetLength(0); i++)
                for (int j = 0; j < outst.GetLength(1); j++)
                    outst[i, j] = t.Prog[i][j];

            return outst;
        }