Я хочу построить экспертную систему, в которой в случае чрезвычайной ситуации в здании с несколькими этажами (цокольный этаж + три этажа) лифт должен поднимать людей в землю. Идея состоит в том, чтобы спасти людей сначала с самого высокого (третий этаж), а затем со второго этажа и в конце с первого этажа. У меня проблема с выраженностью правил (у меня есть отдельные правила для каждого этажа). Вначале наибольший интерес имеет правило «MoveFloor3» - поднимите лифт на третий этаж (потому что я хочу сначала спасти людей с самого высокого этажа). Когда я спасаю всех людей с третьего этажа, я хочу изменить значение в этом правиле на 0 (или на некоторое число меньше значения для второго и первого этажа), потому что после этого я хочу сохранить людей со второго и первого этажа. Код для этого правила приведен ниже, как изменить этот код, чтобы изменить значение после того, как число людей на этом этаже станет 0.
(defrule moveFloor3
(declare (salience 50))
?j<-(lastJob ?t&~moveFloor3)
?e<-(elevator ?peopleInElevator)
?f<-(floor3 ?peopleInFloor)
(capacityElevator ?capacityElevator)
=>
(bind ?newPeopleInElevator (+ ?peopleInElevator (min ?peopleInFloor (- ?capacityElevator ?peopleInElevator))))
(bind ?newPeopleInFloor (- ?peopleInFloor (min ?peopleInFloor (- ?capacityElevator ?peopleInElevator))))
(retract ?e ?f ?s ?j)
(assert (elevator ?newPeopleInElevator))
(assert (floor3 ?newPeopleInFloor))
(assert (lastJob moveFloor3))
(printout t "Elevator moved to third floor" crlf)
)