Архитектура систем планирования и метапланирования
(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 в конце главы будет показано, что существуют наборы мероприятий, с которыми программа не может справиться, хотя составить расписание для них с учетом оговоренных ограничений можно.