public string SetAnswer(string ans, Work_memory wm) //установка факту текущего правила значение "да" или "нет" { if (ans.Contains("да")) { ans = "да"; } else if (ans.Contains("нет")) { ans = "нет"; } else { ans = null; } if (currentRule != null && ans != null) { wm.key.Add(currentRule); wm.value.Add(ans); } return(ans); }
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); } }
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); } }