Я пытаюсь прояснить свое понимание семантики в экспертной системе Clips, поэтому я пытаюсь написать несколько простых правил, чтобы собрать список фактов, чтобы найти факт с наибольшим значением слота. Метафора, которую я использую, - это простой агент, пытающийся решить, должен ли он есть или спать. Факты, описывающие состояния агента, раскрываются в потенциальных действиях, и затем правило пытается найти окончательное действие с наибольшей полезностью.
Это мой код:
(clear)
(deftemplate state
(slot name)
(slot level (type NUMBER))
)
(deftemplate action
(slot name)
(slot utility (type NUMBER))
(slot final (type INTEGER) (default 0))
)
(defrule eat-when-hungry ""
(state (name hungry) (level ?level))
=>
(assert (action (name eat) (utility ?level)))
)
(defrule sleep-when-sleepy ""
(state (name sleepy) (level ?level))
=>
(assert (action (name sleep) (utility ?level)))
)
(defrule find-final-action ""
?current_final <- (action (name ?current_final_action) (utility ?
current_final_utility) (final 1))
(action (name ?other_action) (utility ?other_utility) (final 0))
(neq ?current_final_action ?other_action)
(< ?current_final_action ?other_action)
=>
(modify ?current_final (name ?other_action) (utility ?
other_utility))
)
(assert (action (name none) (utility 0.0) (final 1)))
(assert (state (name hungry) (level 0.5)))
(assert (state (name sleepy) (level 0.1)))
(run)
(facts)
После этого я бы ожидал, что последнее действие будет:
(action (name eat) (utility 0.5) (final 1))
Однако, Clips оценивает его как:
(action (name none) (utility 0.0) (final 1))
указывает, что правило find-final-action никогда не активируется. Почему это? Как бы вы перебрали группу фактов и нашли ее со значением слота min / max?