2016-07-27 17 views
0

Angesichts der folgenden Klassenhierarchie:Löschen Nested Instanzen

(defclass ATOM (is-a USER)) 

(defclass ONE_CHILD (is-a USER) 
    (slot next 
     (type INSTANCE))) 

(defclass MANY_CHILDREN (is-a USER) 
    (multislot next 
     (type INSTANCE))) 

Ich mag würde rekursiv die folgenden Instanzdaten löschen:

(definstances EXAMPLE_DATA 
    (instance-a of ATOM) 

    (instance-b of ONE_CHILD 
     (next (make-instance of ATOM))) 

    (instance-c of MANY_CHILDREN 
     (next (make-instance of ATOM) 
       (make-instance of ATOM) 
       (make-instance of ATOM))) 

    (instance-d of MANY_CHILDREN) 
) 

Wenn ich naiverweise send jede benannte Instanz eine delete Nachricht, dann die Instanzen selbst werden gelöscht, während die verschachtelten Instanzen nicht gelöscht werden. Obwohl ich sicher bin, dass es vorhanden ist, konnte ich keine Dokumentation finden, die beschreibt, wie diese Operation im CLIPS 6.3 Benutzerhandbuch oder im Basic Programming Guide beschrieben wird.

Die folgende Befehlsfolge führt erwartungsgemäß zu einem nicht leeren Satz von Instanzen nach Abschluss. Was kann ich unterscheiden, um die rekursive Löschung durchzuführen?

CLIPS> (reset) 
CLIPS> (instances) 
[initial-object] of INITIAL-OBJECT 
[instance-a] of ATOM 
[instance-b] of ONE_CHILD 
[gen29] of ATOM 
[instance-c] of MANY_CHILDREN 
[gen30] of ATOM 
[gen31] of ATOM 
[gen32] of ATOM 
[instance-d] of MANY_CHILDREN 
For a total of 9 instances. 
CLIPS> (send [instance-a] delete) 
TRUE 
CLIPS> (send [instance-b] delete) 
TRUE 
CLIPS> (send [instance-c] delete) 
TRUE 
CLIPS> (send [instance-d] delete) 
TRUE 
CLIPS> (instances) 
[initial-object] of INITIAL-OBJECT 
[gen29] of ATOM 
[gen30] of ATOM 
[gen31] of ATOM 
[gen32] of ATOM 
For a total of 5 instances. 

Antwort

0

vor Handler erstellen für die Löschen-Meldung für jede Ihrer Klassen, die Kind-Instanzen haben:

(defmessage-handler ONE_CHILD delete before() 
    (send ?self:next delete)) 

(defmessage-handler MANY_CHILDREN delete before() 
    (progn$ (?c ?self:next) 
     (send ?c delete)))