// Перебор правил и добавление выведенных фактов в рабочую память
        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));
        }
Esempio n. 2
0
        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));
        }