deman_ru
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору УважаемыйValidolX, снова обращаюсь к вам за помощью, а так же к другим форумчанам. Есть у меня база данных, она же база знаний для экспертной системы, она имеет структуру: Для механизма вывода решил использовать алгоритм обратного логического вывода, вот его описание: Код: функция Доказана_Цель(Цель): boolean; | Поместить Цель в стек целей. | пока стек целей не пуст | цикл | | Выбор цели из стека целей и назначение ее текущей. | | Поиск множества правил, в правой части которых | | находится текущая цель (множества подходящих правил). | | Считать, что Цель не доказана. | | пока множество походящих правил не пусто | | и Цель не доказана | | цикл | | | Выбор из этого множества одного текущего правила | | | с использованием определенной стратегии. | | | Считать текущим элементарным условием первое. | | | пока не проверены все элементарные условия правила | | | и не надо прервать проверку условия | | | цикл | | | | если в текущем элементарном условии | | | | | участвует факт, | | | | | встречающийся в правой части | | | | | какого-то правила | | | | | то | | | | | если не Доказана_Цель(Этот факт) | | | | | | то | | | | | | Надо прервать проверку условия | | | | | конец_если | | | | иначе | | | | | Запросить информацию о факте. | | | | | Проверить элементарное условие. | | | | | если элементарное условие истинно | | | | | | то | | | | | | Добавить факт в базу данных. | | | | | | Перейти к следующему элементарному | | | | | | Условию. | | | | | иначе | | | | | | Надо прервать проверку условия. | | | | | конец_если | | | | конец_если | | | конец_цикла | | | если условие правила истинно | | | | то | | | | Выполнить заключение. | | | | Исключить Цель из стека целей. | | | | Считать, что Цель доказана. | | | конец_если | | конец_цикла | конец_цикла конец_функции. | вот то что я сделал на C++ для БД: Код: bool function rezult (AnsiString cel) { bool steck=false; while (!steck==true) { rezult=false; DataModule2->IBQuery1->Close(); DataModule2->IBQuery1->SQL->Clear(); DataModule2->IBQuery1->SQL->Add("SELECT * FROM RULE WHERE ZAKLUCHENIYE = ("+cel+")"); DataModule2->IBQuery1->Open(); --Код выбора одного правила из списка---- while (!DataModule2->IBQuery1->Eof && !rezult=true) { DataModule2->IBQuery1->First(); AnsiString prav=DataModule2->IBQuery1->FieldByName("PREDPOSILKA")->AsString; DataModule2->IBQuery2->Close(); DataModule2->IBQuery2->SQL->Clear(); DataModule2->IBQuery2->SQL->Add("SELECT * FROM RULE WHERE ZAKLUCHENIYE = ("+prav+")"); DataModule2->IBQuery2->Open(); //Подсчет строк, проверить встречается ли факт в правой части какого то правила int n=0; while (!DataModule2->IBQuery2->Eof) { n++; DataModule2->IBQuery2->Next(); } //Конец подсчета if (!n==) { if (!rezult(prav)) { break; } else { //Запрос информации о факте//Вывод вопроса для факта-------------------------------------------------------------- DataModule2->IBQuery3->Close(); DataModule2->IBQuery3->SQL->Clear(); DataModule2->IBQuery3->SQL->Add("SELECT QUESTION FROM FACT WHERE IDFACT = ("+prav+")"); DataModule2->IBQuery3->Open(); AnsiString ques=DataModule2->IBQuery3->FieldByName("QUESTION")->AsString; Edit1->Text=ques; //------------------------------------------------------------------------------------- //Вывод значений факта (возможные ответы на вопрос), варианты ответа выводятся в табличку DataModule2->IBQuery4->Close(); DataModule2->IBQuery4->SQL->Clear(); DataModule2->IBQuery4->SQL->Add("SELECT NAMEVALUE FROM VALUE_FACT WHERE IDFACT = ("+prav+")"); DataModule2->IBQuery4->Open(); //------------------------------------------------------------------------------------------Проверить элементарное условие. если элементарное условие истинно то Добавить факт в базу данных. else {break}; } } если условие правила истинно то Выполнить заключение. stack=true; rezult=true; конец_если } } }} | есть куски, я вставил из первого алгоритма, которые не знаю как реализовать, подскажите пожалуйста, ну и по всему коду если есть какие то косяки, а они там есть...хотя может все не правильно(( пожалуйста помогите, или разъясните как лучше сделать, на Вас вся надежда! |