我希望有一条规则可以在玩家的广告资源中显示可能的项目组合。
以下是一些示例事实。项目事实包含项目组合的配方,玩家事实包含玩家库存中的项目。
(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)
)
答案 0 :(得分:0)
如果要检查重复项,则需要像编写自己的函数一样编写自己的函数。