Агрегирующие факты в системе Expert Clips, чтобы найти максимум

StackOverflow https://stackoverflow.com/questions/2382648

  •  24-09-2019
  •  | 
  •  

Вопрос

Я пытаюсь уточнить свое понимание семантики в экспертной системе клипов, поэтому я пытаюсь написать несколько простых правил, чтобы агрегировать список фактов, чтобы найти факт с наивысшим значением слота. Метафора, которую я использую, состоит из простого агента, пытающегося решить, следует ли евать или спать. Факты, описывающие государства агента, расширяются в потенциальные действия, а затем правило пытается найти окончательное действие с самой высокой утилитой.

Это мой код:

(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)) 

Однако клипы оценивают его:

(action (name none) (utility 0.0) (final 1)) 

Указание правила FACE-Final-Action никогда не активируется. Почему это? Как бы вы имеете воспользоваться группой фактов и найду один со значением слота Min / Max?

Это было полезно?

Решение

Ваше правило в нем была пара ошибок. Вот исправленная версия:

(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)) 
    (test (neq ?current_final_action ?other_action))
    (test (< ?current_final_utility ?other_utility)) 
    => 
    (modify ?current_final (name ?other_action) (utility ?other_utility)))

Необходимо соблюдать альтернативный метод, который не требует хранения промежуточных вычислений и множественных правил.

(defrule find-final-action-2 "" 
    (declare (salience -10)) ; lower salience to allow all actions to be asserted first
    (action (name ?action) (utility ?utility)) 
    (not (action (utility ?other_utility&:(> ?other_utility ?utility))))
    => 
    (printout t "Final action is " ?action crlf))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top