2

プレイヤーのインベントリで可能なアイテムの組み合わせを提案するルールが必要です。

以下はいくつかの事実の例です。アイテムファクトにはアイテムの組み合わせのレシピが含まれ、プレーヤーファクトにはプレーヤーのインベントリ内のアイテムが含まれます。

(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)
)
4

1 に答える 1

0

重複をチェックしたい場合は、行ったように独自の関数を作成する必要があります。

于 2013-05-01T20:05:17.290 に答える