// Перебор правил и добавление выведенных фактов в рабочую память public Tuple <string, bool> DefrulesEnumeration() { string factName = null; bool systemExit = false; // Цикл для прохода по узлам в xml-файле foreach (XElement defrule in xml.Root.Elements()) { // Если элемент не имеет дочерних элементов (предпосылок), нет смысла проверять его if (defrule.HasElements) { int premisesCount = defrule.Elements().Count(); int equalsPairsCount = 0; foreach (XElement premise in defrule.Elements()) { foreach (Fact fact in workMemory.GetFactsList()) { // Если имена факта из рабочей памяти и предпосылки совпадают и совпадают их значения, то счетчик сравнения тикает if (fact.Name == premise.Attribute("name").Value&& fact.Value == premise.Attribute("value").Value) { equalsPairsCount++; break; } } } factName = defrule.Attribute("name").Value; factName = factName.Remove(factName.IndexOf("Defrule"), "Defrule".Length); // Если кол-во "равных" пар и кол-во предпосылок текущего правила равны, это означает, что можно занести новый выведенный факт в рабочей памяти if (equalsPairsCount == premisesCount && !workMemory.IsFactСontained(factName)) { workMemory.Add(new Fact(factName, "да")); // Если факт добавлен в РП, стоит проверить, не является ли он университетом foreach (XAttribute attribute in defrule.Attributes()) { if (attribute.Name == "univName") { systemExit = true; factName = attribute.Value; break; } } } if (systemExit) { break; } } } return(Tuple.Create(factName, systemExit)); }
public Tuple <string, bool> DefrulesEnumeration() // перебор правил и добавление выведенных фактов в РП (возвращает имя последнего выведенного факта) { string factName = null; bool systemExit = false; foreach (XElement defrule in xml.Root.Elements()) { if (defrule.HasElements) // если элемент не имеет дочерних элементов (предпосылок), нет смысла проверять его, т.к. финальный вывод состоит из нескольких предпосылок { int premisesCount = defrule.Elements().Count(), equalsPairsCount = 0; foreach (XElement premise in defrule.Elements()) { foreach (Fact fact in workMemory.GetFactsList()) { if (fact.Name == premise.Attribute("name").Value&& fact.Value == premise.Attribute("value").Value) // если имена факта из РП и предпосылки совпадают и совпадают их значения, то счетчик сравнения тикает { equalsPairsCount++; } } } if (equalsPairsCount == premisesCount && !workMemory.IsFactСontained(defrule.Attribute("name").Value)) // если кол-во "равных" пар и кол-во предпосылок текущего правила равны, это означает, что можно занести новый выведенный факт в РП { factName = defrule.Attribute("name").Value; workMemory.Add(new Fact(factName, "да")); //break; foreach (XAttribute attribute in defrule.Attributes()) // если факт добавлен в РП, стоит проверить, не является ли он университетом, т.е. элементом со значением атрибута ruleType равным "university" { if (attribute.Name == "ruleType" && attribute.Value == "university") { systemExit = true; break; } } } } } return(Tuple.Create(factName, systemExit)); }