Ejemplo n.º 1
0
        public bool isReturn = false; //критерий: либо выходить из цикла и дать поль-лю ответ, либо продолжить цикл с готовом ответом

        //метод выдачи либо:
        //1) вопроса поль-лю
        //2) ответа поль-лю
        //3) ответа программе для авто-обработки в цикле
        public string Question(WorkListRules wlr)
        {
            Random rnd = new Random();

            isReturn = false;
            finish   = false;
            string str;

            try
            {
                str         = wlr[0].Ans;
                currentRule = wlr[0].Name;
                wlr.RemoveAt(0);
            }
            catch
            {
                isReturn = true;
                finish   = true;
                return("ответ: неизвестно из-за отсутствия подходящих правил!");
            }

            if (str.Contains("func"))
            {
                isReturn = true;
                str      = str.Substring(str.IndexOf(@"(""") + 2);
                str      = str.Remove(str.LastIndexOf(@""""));
                return(str);
            }
            else
            {
                if (str.Contains(@"""да"""))
                {
                    return("да");
                }
                else if (str.Contains(@"""нет"""))
                {
                    return("нет");
                }

                if (str.Contains("ответ"))
                {
                    isReturn = true;
                    finish   = true;
                    return("ответ: " + currentRule);
                }
            }
            return(null);
        }
Ejemplo n.º 2
0
        bool isStarted = false; //критерий: запущена ли программа

        public string Input(string str, bool flag)
        {
            if (!isStarted)
            {
                if (str.Contains("(load ")) //обработка команды load
                {
                    try
                    {
                        SerializerXML.SerializeXML(path);
                        wlr = new WorkListRules();
                        wm  = new Work_memory();
                        mlv = new MLV();
                        return("Данные успешно подгружены!");
                    }
                    catch { return("Ошибка в загрузке данных!"); }
                }
                else if (str.Contains("(reset)")) //обработка команды reset
                {
                    try
                    {
                        mlv.SetRulesDefault();
                        wlr.Clear();
                        wm.key.Clear();
                        wm.value.Clear();
                        mlv.SetRuless();
                        isStarted = false;
                        return("Данные очищены!");
                    }
                    catch { return("Нет данных, очищать нечего!"); }
                }
                else if (str.Contains("(run)")) //обработка команды run
                {
                    try
                    {
                        isStarted = true;
                        string print = null;
                        if (!flag)
                        {
                            mlv.finish = false;
                            print      = "Запуск алгоритма!\r\n>\r\n>" + LoopMLV("", true);
                        }
                        else
                        {
                            print = "Запуск обратного алгоритма, введите гипотезу!\r\n>\r\n>" + Obr_LoopMLV("");
                        }
                        return(print);
                    }
                    catch { return("Нет данных, запуск алгоритма невозможен!"); }
                }
                else
                {
                    return(null);
                }
            }
            else
            {
                if (!flag)
                {
                    if (str.Contains("да") || str.Contains("нет"))
                    {
                        return(LoopMLV(str, false));
                    }
                }
                else
                {
                    isStarted = false;
                    return(Obr_LoopMLV(str));
                }
            }
            return(null);

            //Цикл млв для выдачи ответа пользователю:
            //1) либо выводит готовый ответ
            //2) либо выдаёт вопрос на который нужно ответить
            string LoopMLV(string s, bool isBegin)
            {
                while (true)
                {
                    mlv.SetAnswer(s, wm);
                    mlv.UpdateRules(wlr, wm, isBegin);
                    isBegin = false;
                    string q = mlv.Question(wlr);
                    if (mlv.finish)
                    {
                        isStarted = false;
                    }
                    if (mlv.isReturn)
                    {
                        return(q);
                    }
                    else
                    {
                        s = q;
                    }
                }
            }

            string Obr_LoopMLV(string s)
            {
                string output = null;

                if (s.Contains(">"))
                {
                    s = s.Remove(0, 1);
                }
                output += mlv.SetRules(s);

                return(output);
            }
        }
Ejemplo n.º 3
0
        public void UpdateRules(WorkListRules wlr, Work_memory wm, bool isBegin) //обноваление рабочего спика правил
        {
            for (int i = 0; i < rules.Length; i++)
            {
                if (!rules[i].isExist)
                {
                    if (checkCond(rules[i]))
                    {
                        RuleIsOld(rules[i]);
                    }

                    void RuleIsOld(Rules r)
                    {
                        if (r.isOld || isBegin)
                        {
                            wlr.Add(r);
                        }
                        else
                        {
                            wlr.Insert(0, r);
                        }

                        r.isExist = true;
                        r.isOld   = true;
                    }
                }
            }

            bool checkCond(Rules r)
            {
                bool ruleIsValid = false;
                bool orCond      = false;
                int  k_or        = 0;

                for (int j = 0; j < r.Conds.Length; j++)
                {
                    string cond    = r.Conds[j];
                    bool   ExistOr = false;
                    if (cond.Contains(@"or """))
                    {
                        ExistOr = true;
                        k_or++;
                    }

                    if (!orCond && !ExistOr && k_or > 0)
                    {
                        return(false);
                    }

                    if (!(ExistOr && orCond))
                    {
                        cond = cond.Substring(cond.IndexOf(@"""") + 1);
                        cond = cond.Remove(cond.LastIndexOf(@""""));
                        string x = cond.Substring(0, cond.IndexOf(@""""));
                        string y = cond.Substring(cond.LastIndexOf(@"""") + 1);
                        if (y != "null")
                        {
                            bool pass = false;
                            for (int i = 0; i < wm.key.Count(); i++)
                            {
                                if (x == wm.key[i] && y == wm.value[i])
                                {
                                    if (ExistOr)
                                    {
                                        orCond = true;
                                    }
                                    pass = true;
                                    break;
                                }
                            }
                            if (pass)
                            {
                                ruleIsValid = true;
                            }
                            else
                            {
                                ruleIsValid = false;
                            }

                            if (!ruleIsValid && !ExistOr)
                            {
                                break;
                            }
                        }
                        else
                        {
                            ruleIsValid = true;
                        }
                    }
                }
                return(ruleIsValid);
            }
        }