我想要一个规则来建议玩家库存中可能的项目组合。
以下是一些示例事实。物品事实包含物品组合的配方,玩家事实包含玩家库存中的物品。
(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)
)