2011-08-01 31 views
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的實例的規則不火。

回答

0

模式匹配過程沒有具體的知識,可能會影響謂詞函數對規則的LHS(在這種情況下爲實例存在函數)的評估結果。在這種情況下,你的規則只匹配classB的實例,所以只有那個實例的變化纔會重新觸發模式匹配。當classB實例最初匹配時,將評估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))