public void TestParsingQuery() { string query = "если 'погода - ветренно', 'дождь - да' то 'взять зонт=?', 'одеться теплее=?'"; IParser parser = new PrModelParser(new LogicalExpressionHelper()); ILogicalQuery q = parser.ParseQuery(query); Assert.IsTrue(q.GetQueriedItems().Count() == 2); Assert.IsTrue(q.GetPreQueryActions().Count() == 2); Assert.IsTrue(q.GetPreQueryActions().All((a) => { return(a is AddFactAction); })); Assert.IsTrue(q.GetQueriedItems().All((a) => { return(a is ProductionFact); })); }
public void TestParsingQueryWithProperty() { string query = "если 'погода - ветренно', 'дождь - да' то 'взять зонт=?обязательно', 'одеться теплее=?обязательно'"; Assert.IsTrue(ProductionQueryGrammar.Query.ExactMatch(query)); IParser parser = new PrModelParser(new LogicalExpressionHelper()); ILogicalQuery q = parser.ParseQuery(query); Assert.IsTrue(q.GetQueriedItems().Count() == 2); Assert.IsTrue(q.GetPreQueryActions().Count() == 2); Assert.IsTrue(q.GetPreQueryActions().All((a) => { return(a is AddFactAction); })); Assert.IsTrue(q.GetQueriedItems().All((a) => { return(a is ProductionFact); })); Assert.IsTrue(q.GetQueriedItems().All(a => { return(a.Value == "обязательно"); })); }
/// <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 <IData> res = new List <IData>(); foreach (var target in queriedData) { if (target.Value == null) { foreach (var possibleTarget in GetPossibleTargets(target)) { if (GetResultRec(possibleTarget)) { //возможная цель реализована res.Add(possibleTarget); break; } } } else { if (GetResultRec(target)) { res.Add(target); } } } ILogicalResult result = new ResultingFactSet(res); cachedResult.Add(result); return(result); }
/// <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); }