我正在尝试编写一条通用规则,该规则将在出现这两个事实时激活:
(向量v1 3 4 5) (向量v2 1 3 10 15 5 2 4)
(元素4 5 3)
所以,我的问题是我不知道如何匹配向量中的所有无序元素,以激发规则。
我希望仅当存在Elements中的所有元素时才激活规则,而不考虑是否遵循相同顺序。
我无法实现,所以我寻求帮助。
规则不符合我的意愿的示例:
(defrule Equal
(Elements $?x)
(Vector ?name $?y)
(test (member$ $?x $?y))
=>
(printout t ?name crlf)
)
*这个问题是,当两个都为空时会触发,主要是当?y中包含单个?x成员时触发,但是我希望当?x中的所有元素都位于?y中时触发规则
我也尝试过使用这种简单的方法:
(defrule Equal
(Elements $? $?x $?)
(Vector ?name $? $?y $?)
=>
(printout t ?name crlf)
)
但是在这种情况下,规则仅在元素完全相同且以相同方式排序时才激活,但是我想让元素具有灵活性,而不必像向量中出现的那样完全排序。
答案 0 :(得分:0)
使用 subsetp 函数而不是 member $ :
CLIPS (6.31 4/1/19)
CLIPS>
(defrule equal
(elements $?elements)
(test (> (length$ ?elements) 0))
(vector ?name $?values)
(test (subsetp ?elements ?values))
=>
(printout t ?name crlf))
CLIPS>
(assert (vector v1 3 4 5)
(vector v2 1 3 10 15 5 2 4)
(vector v3 4 5 7 2)
(elements 4 5 3))
<Fact-4>
CLIPS>
(agenda)
0 equal: f-4,f-2
0 equal: f-4,f-1
For a total of 2 activations.
CLIPS> (run)
v2
v1
CLIPS>
您也可以在不调用函数的情况下执行此操作:
CLIPS> (clear)
CLIPS>
(defrule equal
(elements ? $?)
(vector ?name $?list)
(forall (elements $? ?v $?)
(vector ?name $? ?v $?))
=>
(printout t ?name crlf))
CLIPS>
(assert (vector v1 3 4 5)
(vector v2 1 3 10 15 5 2 4)
(vector v3 4 5 7 2)
(elements 4 5 3))
<Fact-4>
CLIPS> (agenda)
0 equal: f-4,f-2,*
0 equal: f-4,f-1,*
For a total of 2 activations.
CLIPS> (run)
v2
v1
CLIPS>