найдите среднее значение, используя jess или clips

Это код клипа для нахождения среднего...но он не работает...может кто знает как это исправить??

(deftemplate fact (slot name) (slot value))
    (deftemplate avg (slot result))
    (deffacts data
       (fact (name data-1) (value 3))
       (fact (name data-2) (value 1))
       (fact (name data-3) (value 2))
       (fact (name data-4) (value 2))
       (fact (name data-5) (value 4))
       (fact (name data-6) (value 3)))

    (deffact sum (avg (result 0))

    (defrule find-avg
       (fact (name ?name1) (value ?value1))  
       (avg (modify (result (+ result ?value1))
       ))

    (defrule finding-avg
        (avg (modify (result (/ result 6)))
    ))

person int_joy    schedule 26.07.2015    source источник
comment
Код, который вы разместили здесь, очень далек от синтаксически правильного, Джесс. Даже беглый взгляд на руководство Jess должен сказать вам, что правило состоит из двух частей, разделенных =>.   -  person laune    schedule 27.07.2015


Ответы (2)


В CLIPS для этого можно использовать функции запроса фактов:

CLIPS> (deftemplate fact (slot name) (slot value))
CLIPS> (deftemplate avg (slot result))
CLIPS> 
(deffacts data
   (fact (name data-1) (value 3))
   (fact (name data-2) (value 1))
   (fact (name data-3) (value 2))
   (fact (name data-4) (value 2))
   (fact (name data-5) (value 4))
   (fact (name data-6) (value 3)))
CLIPS> 
(deffunction average (?template ?slot)
   (bind ?sum 0)
   (bind ?count 0)
   (do-for-all-facts ((?f ?template)) TRUE
      (bind ?sum (+ ?sum (fact-slot-value ?f ?slot)))
      (bind ?count (+ ?count 1)))
   (if (= ?count 0)
      then FALSE
      else (/ ?sum ?count)))
CLIPS> (reset)
CLIPS> (assert (avg (result (average fact value))))
<Fact-7>
CLIPS> (facts)
f-0     (initial-fact)
f-1     (fact (name data-1) (value 3))
f-2     (fact (name data-2) (value 1))
f-3     (fact (name data-3) (value 2))
f-4     (fact (name data-4) (value 2))
f-5     (fact (name data-5) (value 4))
f-6     (fact (name data-6) (value 3))
f-7     (avg (result 2.5))
For a total of 8 facts.
CLIPS> 
person Gary Riley    schedule 27.07.2015

Вы должны использовать accumulate для подсчета и суммирования слота value по всем fact фактам.

(defrule find-avg
    ?avg <- (accumulate
            (progn (bind ?sum 0)(bind ?count 0))
            (progn (bind ?sum (+ ?sum ?value))(++ ?count))
            (/ ?sum ?count)
            (fact (value ?value)))
=>
    (printout t "average " ?avg crlf)
)

progn требуется для группировки вызовов функций. Функции progn, bind и т. д., а также accumulate очень хорошо описаны в руководстве по Jess, поэтому я не буду повторяться здесь.

person laune    schedule 27.07.2015