首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用jess或clips求平均值

使用jess或clips求平均值
EN

Stack Overflow用户
提问于 2015-07-27 02:45:47
回答 2查看 419关注 0票数 0

这是找出平均值的剪辑代码。但它不起作用。有人知道怎么修吗??

代码语言:javascript
复制
(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)))
    ))
EN

回答 2

Stack Overflow用户

发布于 2015-07-28 00:15:24

在CLIPS中,您可以使用事实查询函数来执行此操作:

代码语言:javascript
复制
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> 
票数 1
EN

Stack Overflow用户

发布于 2015-07-27 13:10:25

您必须使用accumulate对所有fact数值进行槽value计数和求和。

代码语言:javascript
复制
(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)
)

对函数调用进行分组需要prognprognbind等函数以及accumulate在Jess手册中都有很好的说明,所以我不打算在这里重复。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31640647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档