0

これは私が現在持っているものです:

(defclass classA (is-a USER) (role concrete))

(defclass classB (is-a USER) (role concrete)
  (slot a (type INSTANCE)))

(defrule classA-delete
  ?binstance <- (object (is-a classB) (a ?a&~:(instance-existp ?a)))
=>
  (send ?binstance delete))

しかし、classA のインスタンスを削除すると、ルールは起動しません。

4

1 に答える 1

0

パターン マッチング プロセスには、ルールの LHS の述語関数 (この場合は instance-existp 関数) の評価の結果に何が影響するかについての特定の知識はありません。この場合、ルールは classB のインスタンスに対してのみ一致するため、そのインスタンスへの変更のみがパターン マッチングを再トリガーします。classB インスタンスが最初に一致した場合、instance-existp 関数が評価され、成功または失敗します。a スロットの値を変更すると、instance-existp 評価が再トリガーされますが、ルールのパターンに含まれていないインスタンスまたはインスタンス スロットを変更しても、パターン マッチングは再トリガーされません。条件なし要素を使用してインスタンスをチェックすると、必要な動作が得られます。

(defclass classA (is-a USER) 
                 (role concrete))

(defclass classB (is-a USER) 
                 (role concrete)
                 (slot a (type INSTANCE)))

(definstances start
   (a of classA)
   (b of classB (a [a])))  

(defrule classA-delete
  ?binstance <- (object (is-a classB) (a ?a))
  (not (object (name ?a)))
  =>
  (send ?binstance delete))
于 2012-03-16T04:09:56.523 に答える