예제 #1
0
        /// <summary>
        /// Выбирает одно правило из оставшихся равноправных правил, используя какую-нибудь
        /// эвристику (хоть рандомом).
        /// </summary>
        /// <param name="statements">Список правил в порядке активации</param>
        /// <returns></returns>
        public virtual ILogicalStatement ChooseOne(ICollection <ILogicalStatement> statements)
        {
            //т.к. правила находятся в поряке активации, то первое правило в коллекции
            //даст нам breadth first strategy
            ILogicalStatement result = statements.First();

            return(result);
        }
 public void AddStatement(ILogicalStatement statement)
 {
     if (statements.Contains(statement))
     {
         throw new ArgumentException("Правило уже существует.");
     }
     statements.Add(statement);
 }
        /// <summary>
        /// Проверяет истинность логического высказывания.
        /// </summary>
        /// <param name="statement">Логическое утверждение..</param>
        /// <returns>
        /// Возвращает <c>true</c>, если правило можно выполнить.
        /// </returns>
        public override bool CheckStatement(ILogicalStatement statement)
        {
            ProductionRule rule = (ProductionRule)statement;

            foreach (string variableName in rule.Condition.VariableNames)
            {
                foreach (var fact in workMemory)
                {
                    rule.Condition.SetVariable(fact.Name, fact);
                }
            }
            return(rule.Condition.Calculate() == true);
        }
예제 #4
0
        public void TestParsingRules()
        {
            string            rules  = "на случай дождя : если 'холодно - да' и 'влажность-высокая' то 'будет дождь - да', 'взять зонт - да'";
            IParser           parser = new PrModelParser(new LogicalExpressionHelper());
            ILogicalStatement st     = parser.ParseRule(rules);

            Assert.IsTrue(st is ProductionRule); //правило построено правильно (см. предыдущий тест)
            rules = rules + ";" + rules + ";" + rules + ";" + rules + ";";
            IEnumerable <ILogicalStatement> statements = parser.ParseRules(rules);

            //правила построены правильно (т.к. отдельные правила строятся правильно)
            //проверим количество правил
            Assert.IsTrue(statements.Count() == 4);
        }
        /// <summary>
        /// Получает возможные цели вывода. Используется в том случае, если в запросе не указано
        /// значение цели вывода.
        /// </summary>
        /// <param name="statement">Логичесткое утверждение.</param>
        /// <param name="target">Цель вывода.</param>
        /// <returns>Получает возможные цели вывода</returns>
        protected IData GetPossibleTarget(ILogicalStatement statement, IData target)
        {
            ProductionRule rule = statement as ProductionRule;

            if (rule != null)
            {
                foreach (var action in rule.Actions)
                {
                    AddFactAction addFact = action as AddFactAction;
                    if (addFact != null && addFact.Fact.Name == target.Name)
                    {
                        return(addFact.Fact);
                    }
                }
            }
            return(null);
        }
        /// <summary>
        /// Возвращает <c>true</c>, если заданное правило содержит полностю заданную цель.
        /// </summary>
        /// <param name="statement">Логичесткое утверждение.</param>
        /// <param name="target">Цель вывода.</param>
        /// <returns>Возвращает <c>true</c>, если заданное правило содержит полностю заданную цель.</returns>
        protected bool FullyContainsTarget(ILogicalStatement statement, IData target)
        {
            ProductionRule rule = statement as ProductionRule;

            if (rule != null)
            {
                foreach (var action in rule.Actions)
                {
                    AddFactAction addFact = action as AddFactAction;
                    if (addFact != null && addFact.Fact.Name == target.Name &&
                        addFact.Fact.Value == target.Value)
                    {
                        return(true);
                    }
                }
            }
            return(false);
        }
예제 #7
0
        /// <summary>
        /// Получает ответ на логический запрос.
        /// </summary>
        /// <param name="query">Логический запрос.</param>
        /// <returns>
        /// Возвращает результат логического запроса.
        /// </returns>
        protected override ILogicalResult Solve(ILogicalQuery query)
        {
            knBase.ClearWorkMemory();
            this.cachedQuery = query;
            cachedResult.Clear();
            IEnumerable <IKnowledgeBaseAction> init = query.GetPreQueryActions();

            foreach (var item in init)
            {
                item.Execute(knBase);
            }
            List <IData>             queriedData = query.GetQueriedItems().ToList();
            List <ILogicalStatement> ready       = new List <ILogicalStatement>();

            ready = knBase.ActiveSet.ToList();
            while (ready.Count > 0 && queriedData.Count((a) => { return(a.Value == null); }) > 0)
            {
                ILogicalStatement st = ChooseOne(ready);
                ready.Remove(st);
                st.Execute(knBase);
                if (knBase.StateChanged)
                {
                    ready = knBase.ActiveSet.ToList();
                }
                foreach (IData data in knBase.CurrentData)
                {
                    foreach (IData qData in queriedData)
                    {
                        if (qData.Value == null && qData.Name == data.Name)
                        {
                            qData.Value = data.Value;
                        }
                    }
                }
            }
            ILogicalResult result = new ResultingFactSet(queriedData);

            cachedResult.Add(result);
            return(result);
        }
 public void RemoveStatement(ILogicalStatement statement)
 {
     statements.Remove(statement);
 }
 /// <summary>
 /// Проверяет на конфликк два правила. Возвращает true, если два правила конфликуют.
 /// </summary>
 /// <param name="st1">The ST1.</param>
 /// <param name="st2">The ST2.</param>
 /// <returns></returns>
 /// <exception cref="System.NotImplementedException"></exception>
 public override bool CheckConflict(ILogicalStatement st1, ILogicalStatement st2)
 {
     return(false);
 }
 /// <summary>
 /// Удаляет заданной логическое утверждение из существующе базы.
 /// </summary>
 /// <param name="statement">The statement.</param>
 public virtual void RemoveStatement(ILogicalStatement statement)
 {
     stateChanged = true;
     stService.RemoveStatement(statement);
 }
 /// <summary>
 /// Удаляет заданной логическое утверждение из существующе базы.
 /// </summary>
 /// <param name="statement">The statement.</param>
 public void RemoveStatement(ILogicalStatement statement)
 {
     stService.RemoveStatement(statement);
 }
 /// <summary>
 /// Добавляет заданное логическое утвреждение к существующей базе знаний.
 /// </summary>
 /// <param name="statement">The statement.</param>
 public void AddStatement(ILogicalStatement statement)
 {
     stService.AddStatement(statement);
 }
예제 #13
0
 /// <summary>
 /// Добавляет заданное логическое утвреждение к существующей базе знаний.
 /// </summary>
 /// <param name="statement">The statement.</param>
 public override void AddStatement(ILogicalStatement statement)
 {
     start.AddStatement((ProductionRule)statement, null, agenda);
     base.AddStatement(statement);
 }
예제 #14
0
 /// <summary>
 /// Проверяет истинность логического высказывания.
 /// </summary>
 /// <param name="statement">Логическое утверждение..</param>
 /// <returns>
 /// Возвращает <c>true</c>, если правило можно выполнить.
 /// </returns>
 public override bool CheckStatement(ILogicalStatement statement)
 {
     return(agenda.Ready.Contains(statement.Name));
 }
 /// <summary>
 /// Проверяет истинность логического высказывания.
 /// </summary>
 /// <param name="statement">Логическое утверждение..</param>
 /// <returns>
 /// Возвращает <c>true</c>, если правило можно выполнить.
 /// </returns>
 public abstract bool CheckStatement(ILogicalStatement statement);
 /// <summary>
 /// Проверяет на конфликк два правила. Возвращает true, если два правила конфликуют.
 /// </summary>
 /// <param name="st1">The ST1.</param>
 /// <param name="st2">The ST2.</param>
 /// <returns></returns>
 public abstract bool CheckConflict(ILogicalStatement st1, ILogicalStatement st2);
 /// <summary>
 /// Добавляет заданное логическое утвреждение к существующей базе знаний.
 /// </summary>
 /// <param name="statement">The statement.</param>
 public virtual void AddStatement(ILogicalStatement statement)
 {
     stateChanged = true;
     stService.AddStatement(statement);
 }