删除嵌套实例

时间:2016-07-27 19:55:39

标签: clips

给定以下类层次结构:

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

我想以递归方式删除以下实例数据:

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

如果我天真send每个命名实例都有delete消息,那么实例本身会被删除,而嵌套实例则不会。虽然我确信它存在,但我无法在CLIPS 6.3用户手册或基本编程指南中找到描述如何执行此操作的文档。

以下命令序列可预测地在完成时导致非空的实例集。为了执行递归删除,我可以有什么不同?

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.

1 个答案:

答案 0 :(得分:0)

为具有子实例的每个类的删除消息的处理程序之前创建:

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

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