剪辑 - 小例行程序

lus*_*rei 7 clips

我有10个观察环境的传感器.如果正常则传感器为1,否则传感器为0.我需要创建一个功能,如果至少有3个传感器在0上,则会向终端打印出警告信息,并且消息警告只显示一次.我需要在剪辑中做.

谢谢.

   (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)
        )
Run Code Online (Sandbox Code Playgroud)

bog*_*ron 2

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

(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))
Run Code Online (Sandbox Code Playgroud)

根据您的事实运行此规则会得出:

CLIPS> (reset)
CLIPS> (run)
L9L7L2==>WARNING
L9L7L1==>WARNING
L9L2L7==>WARNING
...
L1L2L7==>WARNING
L2L1L7==>WARNING
Run Code Online (Sandbox Code Playgroud)

现在仅当存在三个或更多不正常传感器时才会生成警告;然而,输出提出了第二个问题,即您的警告被多次生成(对于三个不正常传感器的每个独特组合一次)。为了解决这个问题,您可能需要一个控制事实来防止规则多次触发。为此,您可以使用以下内容修改规则:

(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))
Run Code Online (Sandbox Code Playgroud)

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

CLIPS> (reset)
CLIPS> (run)
L9L7L2==>WARNING
CLIPS> 
Run Code Online (Sandbox Code Playgroud)

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