@miroshnik
android/java dev

Как изменить код небольшой экспертной системы на прологе?

Ниже приведён пример программы на 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 это номер правила)
  • Вопрос задан
  • 2659 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы