Ниже приведён пример программы на Turbo Prolog, реализующей простую модельную экспертную систему. Существенным ограничением в примере является то, что База Правил системы может содержать только правила с одним фактом в качестве предпосылки, т.е. правила вида:
если А то В , Р: А->В
При ее работе добавляются правила типа из А следует Б, добавляются факты. Добавленные данные можно записать в БД, запись идет в виде rule("A","Б") и так далее.
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(C).
Надо ее изменить так, чтобы:
возможность ввода нескольких предпосылок ведущих к одному заключению, напр из A и B и С следует D.
В БД это должно записываться в виде rule(5,[A,B,C],D). (5 это номер правила)