使用 OR 组中的绑定模式变量来测试 CLIPS 规则中的条件元素
Using bound pattern variables from an OR group to test conditional elements in CLIPS rules
我基本上想创建 1 个规则,如果 2 个事实中的任何一个高于某个值,该规则就会触发,即具有以下 LHS 的规则:
(or
(object-0 (value ?x))
(object-1 (value ?y))
)
(test
(or
(> ?x 1)
(> ?y 2)
)
)
问题 是如果这些对象之一不存在,这将不起作用。这非常有意义,因为您无法对甚至不存在的变量进行操作。
我真的希望避免将其拆分为 2 个单独的规则,除非万不得已。有什么办法吗?也许有一些骇人听闻的(存在的)陈述?
CLIPS (6.31 6/12/19)
CLIPS>
(deftemplate object-0
(slot value))
CLIPS>
(deftemplate object-1
(slot value))
CLIPS>
(defrule example-1
(or (object-0 (value ?x&:(> ?x 1)))
(object-1 (value ?y&:(> ?y 2))))
=>)
CLIPS>
(defrule example-2
(or (and (object-0 (value ?x))
(test (> ?x 1)))
(and (object-1 (value ?y))
(test (> ?y 2))))
=>)
CLIPS>
(defrule example-3
(exists (or (object-0 (value ?x&:(> ?x 1)))
(object-1 (value ?y&:(> ?y 2)))))
=>)
CLIPS> (assert (object-0 (value 3)) (object-1 (value 4)))
<Fact-2>
CLIPS> (agenda)
0 example-1: f-2
0 example-2: f-2
0 example-1: f-1
0 example-3: *
0 example-2: f-1
For a total of 5 activations.
CLIPS>
我基本上想创建 1 个规则,如果 2 个事实中的任何一个高于某个值,该规则就会触发,即具有以下 LHS 的规则:
(or
(object-0 (value ?x))
(object-1 (value ?y))
)
(test
(or
(> ?x 1)
(> ?y 2)
)
)
问题 是如果这些对象之一不存在,这将不起作用。这非常有意义,因为您无法对甚至不存在的变量进行操作。
我真的希望避免将其拆分为 2 个单独的规则,除非万不得已。有什么办法吗?也许有一些骇人听闻的(存在的)陈述?
CLIPS (6.31 6/12/19)
CLIPS>
(deftemplate object-0
(slot value))
CLIPS>
(deftemplate object-1
(slot value))
CLIPS>
(defrule example-1
(or (object-0 (value ?x&:(> ?x 1)))
(object-1 (value ?y&:(> ?y 2))))
=>)
CLIPS>
(defrule example-2
(or (and (object-0 (value ?x))
(test (> ?x 1)))
(and (object-1 (value ?y))
(test (> ?y 2))))
=>)
CLIPS>
(defrule example-3
(exists (or (object-0 (value ?x&:(> ?x 1)))
(object-1 (value ?y&:(> ?y 2)))))
=>)
CLIPS> (assert (object-0 (value 3)) (object-1 (value 4)))
<Fact-2>
CLIPS> (agenda)
0 example-1: f-2
0 example-2: f-2
0 example-1: f-1
0 example-3: *
0 example-2: f-1
For a total of 5 activations.
CLIPS>