Подсчет существующих фактов в правилах RHS of Clips - PullRequest
1 голос
/ 02 сентября 2010

Как вы проверяете наличие фактов в RHS правил в Clips ? Я пытаюсь разработайте правило, которое будет «оценивать» текущее состояние, подсчитывая, сколько существует целевых фактов. Очевидно, как проверить факты в LHS, но я не могу найти, как сделать эквивалент в RHS.

Я хочу сделать что-то вроде этого, хотя это недействительно. Код клипа:

(defrule score-state ""
    ?score <- (score (value ?value))
    =>
    (modify ?score (value (+ (exists (goal-1)) (exists (goal-2)) (exists (goal-3))))))

Таким образом, если бы ни одно из целевых состояний не существовало, тогда существовал бы факт (оценка (значение 0)). И наоборот, если бы существовали все целевые состояния, то существовал бы факт (оценка (значение 3)).

В справочном руководстве упоминается функция fact-existp, но, похоже, для этого требуется передать адрес факта. Я пытался использовать его как (fact-therep (goal-1)), но Clips дает мне синтаксическую ошибку.

1 Ответ

1 голос
/ 23 апреля 2012
(deftemplate score
   (slot value))

(deftemplate goal-1)

(deftemplate goal-2)

(deftemplate goal-3)

(deffacts start
   (score (value undefined))
   (goal-1)
   (goal-3))

(deffunction ecount (?g)
   (if (any-factp ((?f ?g)) TRUE)
      then (return 1)
      else (return 0)))

(defrule score-state ""
    ?score <- (score (value undefined))
    =>
    (modify ?score (value (+ (ecount goal-1) (ecount goal-2) (ecount goal-3)))))
...