CLIPS子集重复值

时间:2013-03-17 04:58:57

标签: subset clips

我希望有一条规则可以在玩家的广告资源中显示可能的项目组合。

以下是一些示例事实。项目事实包含项目组合的配方,玩家事实包含玩家库存中的项目。

(player (name x) (inventory "aaa" "bbb" "ccc"))

(item (name xxx) (recipe "aaa" "bbb"))
(item (name yyy) (recipe "aaa" "aaa" "ccc"))

以下是我写的规则:

; ; Item Combination rule
(defrule item-combination
    (player (name ?n1) (inventory $?i1))
    (item (name ?n2) (recipe $?i2))
    (test (subsetp $?i2 $?i1))
    =>
    (assert (can-combine ?n1 ?n2))
)

如果配方中没有重复项,则规则很有效。

例如,对于项目yyy,我们需要2个“aaa”实例,但是(subsetp(aaa aaa ccc)(aaa bbb ccc))将返回true。但是,我要求玩家的广告资源中包含2个“aaa”实例。

我想知道是否有一个函数来检查涉及重复值的子集。

编辑:我编写了自己的函数

(deffunction subsetdp (?sub ?set) 
    (if (eq 0 (length$ ?sub)) 
        then (return TRUE))
    (bind ?x (member$ (nth$ 1 ?sub) ?set))
    (if ?x 
        then (return (subsetdp (rest$ ?sub) (delete$ ?set ?x ?x))))
    FALSE)
)

1 个答案:

答案 0 :(得分:0)

如果要检查重复项,则需要像编写自己的函数一样编写自己的函数。