如何使用逻辑运算符撤回复杂模式中的事实

How to retract facts in complex patterns with logical operators

我是一名学生,目前对 Clips 的了解越来越多,并且刚刚收到我教授的作业。很难说,但我还是想学习如何做。

我有以下规则:

(defrule R1
?x <- (current on)

(or
(alarm water)
(and (alarm fire) (sprinklers working) )
(alarm explosion) )

=>

(retract ?x)
(assert (current off))
(printout t “Turn off electricity” crlf) )

我的任务是修改规则(而不是创建其他规则),以便删除激活规则的事实。 到目前为止,我明白我必须将相同的变量分配给 or 中的第一个和第三个模式,并在 action 部分将其收回,但是应该用 and 括号做什么? 由于我仍处于起步阶段,目前正在学习 and,or 运算符,因此我不应该使用像 类、模板等高级东西

但是任何解决方案都是最受欢迎的。 感谢阅读

or 条件元素通过创建多个规则来工作,每个规则对应于 or 条件元素中包含的每个可能的条件元素组合规则。所以这个规则:

(defrule example
   (or (a) (b))
   (or (c) (d))
   =>)

实现为共享相同名称的四个独立规则:

(defrule example
   (a)
   (c)
   =>)

(defrule example
   (a)
   (d)
   =>)

(defrule example
   (b)
   (c)
   =>)

(defrule example
   (b)
   (d)
   =>)

因此,所有 条件元素所做的就是自动创建共享通用模式的规则排列的过程。由于所有生成的规则共享相同的操作,您不能让操作引用仅绑定在不同规则的某些模式中的变量。

在以下情况下,您可以在规则的操作中收回警报事实,因为变量 ?a 在每个模式中都与 条件元素绑定:

         CLIPS (6.31 6/12/19)
CLIPS> 
(defrule R1
   ?x <- (current on)
   (or ?a <- (alarm water)
       (and ?a <- (alarm fire) 
            (sprinklers working))
       ?a <- (alarm explosion))

   =>
  (retract ?x ?a)
  (assert (current off))
  (printout t "Turn off electricity" crlf))
CLIPS> (assert (current on) (alarm fire) (sprinklers working))
<Fact-3>
CLIPS> (run)
Turn off electricity
CLIPS> (facts)
f-0     (initial-fact)
f-3     (sprinklers working)
f-4     (current off)
For a total of 3 facts.
CLIPS> 

但是您无法将模式(洒水器工作)绑定到变量 ?s 然后尝试在操作中(收回 ?s),因为变量 ?s 不会绑定在每个自动生成的规则。

如果您将作业视为一个谜题,而不是一堂关于如何实际编写规则的课程,您可以复制一些模式并将它们绑定到不同的变量,以便在规则的操作绑定到规则条件中的值:

CLIPS> (clear)
CLIPS> 
(defrule R1
   ?x <- (current on)
   (or (and ?a <- (alarm water)
            ?s <- (alarm water))
       (and ?a <- (alarm fire) 
            ?s <- (sprinklers working))
       (and ?a <- (alarm explosion)
            ?s <- (alarm explosion)))

   =>
  (retract ?x ?a ?s)
  (assert (current off))
  (printout t "Turn off electricity" crlf))
CLIPS> (assert (alarm water))
<Fact-1>
CLIPS> (assert (current on))
<Fact-2>
CLIPS> (run)
Turn off electricity
CLIPS> (facts)
f-0     (initial-fact)
f-3     (current off)
For a total of 2 facts.
CLIPS> (assert (alarm fire) (sprinklers working))
<Fact-5>
CLIPS> (assert (current on))
<Fact-6>
CLIPS> (run)
Turn off electricity
CLIPS> (facts)
f-0     (initial-fact)
f-3     (current off)
For a total of 2 facts.
CLIPS>