Средства разработки приложений


Prolog_facts.shtml


Сортировка фактов ПРОЛОГа

Ермолаев Д.С., Москва

09.04.2002

Программа на ПРОЛОГе оперирует с базой знаний, состоящей из фактов. Как правило, поиск решения идет с помощью перебора всех возможных фактов. Это может привести к значительным потерям времени. Поэтому, иногда необходимо отсортировать факты так, что бы программа начинала просмотр знаний с наилучшего варианта для ускорения поиска решения. Здесь предложен алгоритм сортировки фактов языка ПРОЛОГ. Алгоритм и его реализация на Visual Prolog 5.2 была сделана мною за 3 часа. Я не знаю какой это метод, потому как сам его придумал. Я слышал что есть метод с какими-то пузырьками, возможно это его подобие :) ------------------------------------ domains ИмяЗаписи = string НомерЗаписи, ЗначениеЗаписи = integer МояЗапись=моя_запись(НомерЗаписи, ИмяЗаписи, ЗначениеЗаписи); пусто database - мои_записи мз(МояЗапись) predicates показать_мои_записи значение_записи(МояЗапись,ЗначениеЗаписи) запись_выбрать(МояЗапись З1, МояЗапись З2, МояЗапись Вставить, МояЗапись Наверх) запись_вставить(МояЗапись) сортировка(МояЗапись Вниз, МояЗапись Вверх) - (i,o) сортировка откат clauses откат:-fail. % взять значение записи значение_записи(моя_запись(_,_,Значение),Значение):-!. % выбрать какую запись добавить, а какую передать наверх запись_выбрать(Запись1,пусто,пусто,Запись1):-!. запись_выбрать(Запись1,Запись2,Запись1,Запись2):- значение_записи(Запись1,Значение1), значение_записи(Запись2,Значение2), Значение1>Значение2, !. запись_выбрать(Запись1,Запись2,Запись2,Запись1):- !. % вставить факт обратно в базу знаний запись_вставить(пусто):-!. запись_вставить(Запись):- asserta(мз(Запись)), !. % сама сортировка сортировка(ЗаписьВниз,ЗаписьНаверх):- % выбрать запись из базы знаний retract(мз(Запись1)), % определить какую из записей передать вниз, % а какую возможно вставить в этом предикате запись_выбрать(ЗаписьВниз,Запись1,ЗаписьВниз1,ЗаписьВставить1), % рекурсия сортировки вниз сортировка(ЗаписьВниз1,Запись2), % определить какую запись вставить обратно в знания % а какую передать наверх запись_выбрать(ЗаписьВставить1,Запись2,ЗаписьВставить,ЗаписьНаверх), % выбранную запись на вставление - вставляем запись_вставить(ЗаписьВставить), !. % конец фактов - запомним последний сортировка(Запись,пусто):- запись_вставить(Запись), !.


Начало  Назад  Вперед



Книжный магазин