/// <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); }
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); }
/// <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); }
/// <summary> /// Добавляет заданное логическое утвреждение к существующей базе знаний. /// </summary> /// <param name="statement">The statement.</param> public override void AddStatement(ILogicalStatement statement) { start.AddStatement((ProductionRule)statement, null, agenda); base.AddStatement(statement); }
/// <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); }