如果匹配了一个或多个模式,则正常(或)元素的计算结果为真:
(or
(object (name name-1))
(object (name name-2))
(object (name name-3))
(object (name name-4))
)问题是:如果2、或更多的模式匹配,是否有一种简单的方法来创建一个修改(或)元素,计算结果为TRUE?
当然,这种愚蠢的野蛮做法会是这样的,但我相信还有一种更顺畅的方法。
(or
(and
(object (name name-1))
(object (name name-2))
)
(and
(object (name name-1))
(object (name name-3))
)
(and
(object (name name-1))
(object (name name-4))
)
(and
(object (name name-2))
(object (name name-3))
)
...
)发布于 2021-03-13 18:55:58
如果您试图匹配两个以上的对象,那么使用相同数量的模式,并通过调用实用程序函数放弃无关的排列:
CLIPS (6.31 6/12/19)
CLIPS> (defclass X (is-a USER))
CLIPS>
(definstances Xs
(name-0 of X)
(name-1 of X)
(name-3 of X)
(name-4 of X)
(name-5 of X))
CLIPS>
(deffunction in-order (?n1 ?n2)
(< (str-compare ?n1 ?n2) 0))
CLIPS>
(defrule r1
(object (name ?name1&[name-1] | [name-2] | [name-3] | [name-4]))
(object (name ?name2&[name-1] | [name-2] | [name-3] | [name-4]))
(test (in-order ?name1 ?name2))
=>)
CLIPS>
(defrule r2
(exists
(object (name ?name1&[name-1] | [name-2] | [name-3] | [name-4]))
(object (name ?name2&[name-1] | [name-2] | [name-3] | [name-4]))
(test (in-order ?name1 ?name2)))
=>)
CLIPS> (reset)
CLIPS> (agenda)
0 r1: [name-1],[name-4]
0 r1: [name-3],[name-4]
0 r1: [name-1],[name-3]
0 r2: *
For a total of 4 activations.
CLIPS> https://stackoverflow.com/questions/66615881
复制相似问题