如何使用逻辑运算符撤回复杂模式中的事实
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>
我是一名学生,目前对 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>