Иллюстрированный самоучитель по введению в экспертные системы

Архитектура систем планирования и метапланирования

(defrule priority4
(declare (salience 60))
(goal (subgoal start))
?E < – (errand (name.?N) (earliest?T)
(duration?D) (priority?P) (done no))
(errand (name?M&~?N) (duration?C))
(schedule (task?M)
(start?U&:(<=?U?T)) (finish?F&:
(<= (+?T?D)?F)))
)
 ›
(printout t crlf?N " would
occur during "?M t crlf)
?N " может появиться во время "
?М (modify?E (earliest (+t?U?C)))
)
;; Изменение цели. Новая цель – установка конечного
;; времени выполнения задачи. (defrule change-goal
?G < – (goal (subgoal start)) ›
(modify?G (subgoal finish))
)
;; Время завершения задачи – это время начала ее
;; выполнения плюс продолжительность. (defrule endpoint
(goal (subgoal finish))
(errand (name?N) (latest?L) (duration?D))
?S < – (schedule (task?N) (start
?!&:(<=?T?L)) (finish 0))… ›
(printout t crlf "Fixing end of"?N t crlf)
;; "Определение завершения "?N
(modify?S (finish (+t?T?D)))
;; Новая цель – вывести отчет о плане.
(defrule unfinish
?G < – (goal (subgoal finish)) ›
(modify?G (subgoal report))
)
;; Вывести задачи в хронологическом порядке.
(defrule scheduled
(declare (salience 10)) (goal (subgoal report))
?S < – (schedule (task?N) (start?T1) (finish?T2S"0)
(status 0)). '(not (schedule (start?T
3&:(<=?T3?T1)) (status 0)))
)
 ›
(printout t crlf?N " from "?T1 " till "?T2t crlf)
;;?N " от "?T1 " до "?T2
(modify?S (status 1))
)
;; Для некоторых задач в расписании может не найтись
;; места.
(defrule unscheduled
(goal (subgoal report))
?S ← (schedule (task?N) (finish 0) (status 0))
(printout t crlf?N " not scheduled. " t crlf)
;;?N " не включена в расписание. "
(modify?S (status 1)))

Эта программа успешно справляется с составлением расписания мероприятий, перечисленных после оператора deffact. В упр. 4 в конце главы будет показано, что существуют наборы мероприятий, с которыми программа не может справиться, хотя составить расписание для них с учетом оговоренных ограничений можно.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.