Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Prolog > Экспертная система Turbo Prolog!


Автор: bhgbx 13.1.2014, 15:13
Доброго всем времени суток. Нужна ваша помощь. Есть пример экспертной системы на Prolog и ее если возможно немного преобразовать под необходимый вариант. Сначала идет основной код системы затем вариант, под который ее необходимо модернизировать. Вариант-способ ввода. Система должна быть только в TP

 DOMAINS
 fact = Symbol
 condlist = symbol*
 PREDICATES
 run
 dial_win(integer)
 do(Char)
 repeat
 addrule
 addfact
 testfact(fact)
 testrule(fact,fact)
 testgoal(fact)
 do_goal
 DATABASE
 rule(fact,fact)
 fact(fact)
 GOAL
 run.
 CLAUSES
 repeat.
 repeat:-repeat.
 run:-makewindow(1,1,31,"РЕЖИМЫ РАБОТЫ",2,2,8,30),
 makewindow(2,1,31,"Ввод правил и фактов",10,2,10,50), 
 shiftwindow(2),attribute(30),clearwindow,
 shiftwindow(1),attribute(30),clearwindow,
 field_str(0,1,25,"1 - Добавить правило"), 
 field_str(1,1,25,"2 - Добавить факт "), 
 field_str(2,1,25,"3 - Логический вывод"), 
 field_str(3,1,25,"4 - Сохранить БЗ "),
 field_str(4,1,25,"5 - Загрузить БЗ "),
 field_str(5,1,25,"6 - Конец работы "),
 retractall(_),
 /* Основной цикл МЕНЮ */
 repeat,shiftwindow(1),readchar(Key), do(Key). 
 do('1'):-addrule,fail. 
 do('2'):-addfact,fail. 
 do('3'):-do_goal,write("Цель истинна!"),nl,!,fail. 
 do('3'):-write("Цель ложна!"),nl,fail. 
 do('4'):-dial_win(31),retractall(fact(_)),
 deletefile("expert.db"),save("expert.db"),
 write("БЗ сохранена!"),nl,fail. 
 do('5'):-dial_win(31),consult("expert.db"),
 write("БЗ загружена!"),nl,fail. 
 do('6'). 
 dial_win(Atr):-shiftwindow(2),attribute(Atr).
 addfact:-shiftwindow(2), attribute(30),
 write("Введите факт : "), readln(Fact),Fact<>"",
 testfact(Fact).
 addrule:-dial_win(30),
 write("Предпосылка : "), readln(Cond),Cond<>"",
 write("Заключение : "), readln(Concl),Concl<>"",
 testrule(Cond,Concl).
 testfact(F):-fact(F), write("ERROR: Факт есть в БЗ !"), nl. 
 testfact(F):-not(fact(F)), assert(fact(F)), write("OK"), nl.
 testrule(F,Z):-rule(F,Z), write("ERROR: Правило есть в БЗ !"),
 nl. 
 testrule(F,Z):-not(rule(F,Z)), assert(rule(F,Z)), write("OK"),
 nl.
 do_goal :-dial_win(28),write("Введите цель : "), readln(G),
 G<>"", testgoal(G).
 testgoal(G):-fact(G),!.
 testgoal(G):-rule(C,G),testgoal©.

 ВАРИАНТЫ ЗАДАНИЙ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ.
 Правила Базы Правил поименованы и могут содержать произвольное количество фактов в предпосылке (левой части правила). Варианты представления Базы Правил и Базы Фактов приведены на примере представления правила
 правило № 5: если a и b и c то d
 и наличия в рабочей памяти фактов a, b, c.

 База правил.
 rule(["правило № 5",d], [a,b,c])
 База фактов:
 fact(a), fact(b), fact©

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)