匹配两个具有相同元素但顺序不同的向量

时间:2019-05-01 22:06:24

标签: clips

我正在尝试编写一条通用规则,该规则将在出现这两个事实时激活:

(向量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)
)

但是在这种情况下,规则仅在元素完全相同且以相同方式排序时才激活,但是我想让元素具有灵活性,而不必像向量中出现的那样完全排序。

1 个答案:

答案 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>