1

Clipsのルールの RHS に事実が存在することをどのようにテストしますか? 目標事実がいくつ存在するかを数えることによって、現在の状態を「スコアリング」するルールを設計しようとしています。LHS で事実をテストする方法は明らかですが、RHS で同等のテストを行う方法が見つかりません。

これは有効なClipsコードではありませんが、次のようなことをしたいです:

(defrule score-state ""
    ?score <- (score (value ?value))
    =>
    (modify ?score (value (+ (exists (goal-1)) (exists (goal-2)) (exists (goal-3))))))

そのため、ゴール状態が存在しない場合、事実 (スコア (値 0)) が存在します。逆に、すべてのゴール状態が存在する場合、事実 (スコア (値 3)) が存在します。

リファレンス マニュアルには関数 fact-existp が記載されていますが、これにはファクト アドレスを渡す必要があるようです。(fact-existp (goal-1)) のように使用してみましたが、Clips で構文エラーが発生します。

4

1 に答える 1

1
(deftemplate score
   (slot value))

(deftemplate goal-1)

(deftemplate goal-2)

(deftemplate goal-3)

(deffacts start
   (score (value undefined))
   (goal-1)
   (goal-3))

(deffunction ecount (?g)
   (if (any-factp ((?f ?g)) TRUE)
      then (return 1)
      else (return 0)))

(defrule score-state ""
    ?score <- (score (value undefined))
    =>
    (modify ?score (value (+ (ecount goal-1) (ecount goal-2) (ecount goal-3)))))
于 2012-04-23T19:17:09.753 に答える