プレイヤーのインベントリで可能なアイテムの組み合わせを提案するルールが必要です。
以下はいくつかの事実の例です。アイテムファクトにはアイテムの組み合わせのレシピが含まれ、プレーヤーファクトにはプレーヤーのインベントリ内のアイテムが含まれます。
(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の場合、「aaa」のインスタンスが2つ必要ですが、(subsetp(aaa aaa ccc)(aaa bbb ccc))はtrueを返します。ただし、プレイヤーのインベントリに「aaa」のインスタンスが2つ含まれている必要があります。
重複する値を含むサブセットをチェックする機能があるのだろうか。
編集:私は自分の関数を書きました
(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)
)