【发布时间】:2013-03-17 04:58:57
【问题描述】:
我想要一个规则来建议玩家库存中可能的项目组合。
以下是一些示例事实。物品事实包含物品组合的配方,玩家事实包含玩家库存中的物品。
(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)
)
【问题讨论】: