예제 #1
0
        static void Main(string[] args)
        {
            IStorageService service = new PrMInMemoryStService();
            IKnowledgeBase  knBase  = new ProductionModelReteNetwork(service);
            //IProductionSolver solver = new DirectProductionSolver(knBase); //breadth first
            //IProductionSolver solver = new DepthFirstDirectProductionSolver(knBase); //depth first;
            IProductionSolver       solver = new SimplicityFirstDirectSolver(knBase); //simplicity first;
            LogicalExpressionHelper eh     = new LogicalExpressionHelper();
            IParser       parser           = new PrModelParser(eh);
            IExpertSystem expert           = new ExpertSystemBase(knBase, solver, parser);
            string        rules            = Properties.Resources.TravelBase;

            Console.WriteLine("Parsing rules...");
            expert.AddRules(rules);
            Console.WriteLine("Done!");
            string query = "если 'выбор направления-Европа', 'выбор страны-Испания', 'приоритет отеля-центр города', 'приоритет города-экскурсии', 'количество звезд-4' то 'отель=?'";

            //string query = "если 'желание-купить', 'денег-достаточно', 'расстояние-равно', " +
            //    "'цены лучше-РИО' то 'пойти в РИО=?', 'пойти в Рубин=?'";
            Console.WriteLine("Submitting query: {0}", query);
            Console.Write("Result:");
            ResultingFactSet result = (ResultingFactSet)expert.GetResult(query);

            foreach (var item in result)
            {
                if (item.Value != null)
                {
                    Console.WriteLine(item);
                }
            }
            Console.ReadKey();
        }
예제 #2
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); }));
        }
예제 #3
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 == "обязательно"); }));
        }
예제 #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);
        }
예제 #5
0
        public void TestReteCreation()
        {
            //это прсото тест на создание
            //корректность создания и работы проверяется в тесте решателя

            IParser                    parser  = new PrModelParser(new LogicalExpressionHelper());
            IStorageService            service = new PrMInMemoryStService();
            ProductionModelReteNetwork rete    = new ProductionModelReteNetwork(service);

            foreach (var statement in parser.ParseRules(Properties.Resources.sampleBase))
            {
                rete.AddStatement(statement);
            }
        }
예제 #6
0
        public void TestDirectReteNetworkSolver()
        {
            IKnowledgeBase          knBase = new ProductionModelReteNetwork(new PrMInMemoryStService());
            ILogicalSolver          solver = new DirectProductionSolver(knBase);
            LogicalExpressionHelper eh     = new LogicalExpressionHelper();
            IParser parser = new PrModelParser(eh);

            expert = new ExpertSystemBase(knBase, solver, parser);
            string rules = Properties.Resources.knowledgeBase;

            expert.AddRules(rules);
            string         query  = "если 'валютный курс доллара - падает' то 'уровень цен на бирже=?'";
            ILogicalResult result = expert.GetResult(query);

            Assert.IsTrue(result is ResultingFactSet);
            Assert.IsTrue(result.ToString() == "'уровень цен на бирже - падает'");
        }
예제 #7
0
        public void TestDbParsing()
        {
            IParser parser = new PrModelParser(new LogicalExpressionHelper());

            parser.ParseRule("Если 'страна-канада' и 'приоритет города-городской отдых' то 'город-oттава'");
        }