首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >剪辑.小例程程序

剪辑.小例程程序
EN

Stack Overflow用户
提问于 2013-12-16 11:30:13
回答 2查看 509关注 0票数 7

我有10个感应器可以观察环境。传感器为1(如果确定),0(如果不是)。如果至少有3个传感器在0上,我需要创建一个函数,它将打印一条警告消息到终端,并且消息警告只显示一次。这是我需要用剪辑做的。

谢谢。

代码语言:javascript
复制
   (deffacts listaSenzor
    (sensor L1 0)
    (sensor L2 0) 
    (sensor L3 1)
    (sensor L4 1)
    (sensor L5 1)
    (sensor L6 1)
    (sensor L7 0)
    (sensor L8 1)
    (sensor L9 0)
    )
    (defrule rr
        (sensor ?a  0 )
        (sensor ?b  0 )
        (sensor ?c  0 )
        =>
        printout t ?a ?b ?c "==>WARNING" crlf)
        )
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-16 15:22:27

有两个问题你需要处理。首先,您定义的模式可以多次匹配相同的事实(例如,传感器L1将绑定到abc)。为了解决这个问题,您需要确保abc是唯一的。这样做的一种方法如下(注意,我还添加了一个缺失的"(“在您的printout语句前面):

代码语言:javascript
复制
(deffacts listaSenzor
    (sensor L1 0)
    (sensor L2 0) 
    (sensor L3 1)
    (sensor L4 1)
    (sensor L5 1)
    (sensor L6 1)
    (sensor L7 0)
    (sensor L8 1)
    (sensor L9 0))
(defrule rr
    (sensor ?a 0)
    (sensor ?b 0)
    (sensor ?c 0)
    (test (neq ?a ?b))
    (test (neq ?a ?c))
    (test (neq ?b ?c))
=>
    (printout t ?a ?b ?c "==>WARNING" crlf))

根据事实运行这条规则可以得出如下结论:

代码语言:javascript
复制
CLIPS> (reset)
CLIPS> (run)
L9L7L2==>WARNING
L9L7L1==>WARNING
L9L2L7==>WARNING
...
L1L2L7==>WARNING
L2L1L7==>WARNING

现在只有当有三个或更多的不确定传感器时才会生成警告;但是,输出出现了第二个问题,即您的警告是多次生成的(每三个不确定传感器的唯一组合就生成一次)。为了避免这种情况,您可能需要一个控制事实来防止规则多次触发。要实现这一点,您可以使用以下内容修改规则:

代码语言:javascript
复制
(defrule rr
    (not (sensor-warning))
    (sensor ?a 0)
    (sensor ?b 0)
    (sensor ?c 0)
    (test (neq ?a ?b))
    (test (neq ?a ?c))
    (test (neq ?b ?c))
=>
    (assert (sensor-warning))
    (printout t ?a ?b ?c "==>WARNING" crlf))

这确保规则只触发一次(除非您撤回sensor-warning事实)。使用更新的规则运行:

代码语言:javascript
复制
CLIPS> (reset)
CLIPS> (run)
L9L7L2==>WARNING
CLIPS> 

这是一个简单的解决你的问题。如果您可能会更改应该触发规则的not传感器的数量,那么您可能应该用更一般的逻辑替换“硬连线”传感器名称比较(例如,您可以计算不确定传感器的总数并将其与阈值进行比较)。

票数 2
EN

Stack Overflow用户

发布于 2013-12-17 18:05:41

另一种方法是:

代码语言:javascript
复制
(deftemplate sensor
   (slot id)
   (slot value))

(deffacts listaSenzor
   (sensor (id L1) (value 0))
   (sensor (id L2) (value 0)) 
   (sensor (id L3) (value 1))
   (sensor (id L4) (value 1))
   (sensor (id L5) (value 1))
   (sensor (id L6) (value 1))
   (sensor (id L7) (value 0))
   (sensor (id L8) (value 1))
   (sensor (id L9) (value 0)))

(defrule rr
   (exists 
      (sensor (id ?id1) (value 0))
      (sensor (id ?id2&~?id1) (value 0))
      (sensor (id ?id3&~?id2&~?id1) (value 0)))
   =>
   (bind ?sensors (create$))
   (do-for-all-facts ((?f sensor)) (eq ?f:value 0)
      (bind ?sensors (create$ ?sensors ?f:id)))
   (printout t (str-implode ?sensors) " ==> WARNING" crlf))

这将打印所有的传感器,如果有超过3个,其值为0。

代码语言:javascript
复制
CLIPS> (reset)
CLIPS> (run)
L1 L2 L7 L9 ==> WARNING
CLIPS> 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20609840

复制
相关文章

相似问题

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