示例#1
0
        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); }));
        }
示例#2
0
        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);
        }
示例#4
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);
        }