如何根据 class 中的特定插槽在 LHS 侧按顺序获取剪辑中的对象

how to get the objects in clips in order on LHS side based on a particular slot in class

有没有什么方法可以根据 class 中的特定插槽在 LHS 侧按顺序获取剪辑中的对象?

(defclass SAMPLE
    "all the information about students"
    (is-a BASE_SAMPLE) (role concrete) (pattern-match reactive)
    (slot ID   (create-accessor read-write) (access initialize-only) (propagation inherit) (visibility public) (type INTEGER))
    (slot NAME  (create-accessor read-write) (access initialize-only) (propagation inherit) (visibility public) (type STRING))
)

如果我有 100 个 SAMPLE 对象,并且我希望所有对象都根据规则的 LHS 上的插槽 ID 以升序排列,这是剪辑中的 poosilbe 吗?

您可以通过两种方式对对象进行排序。您可以在 LHS 上执行此操作,方法是向对象或单独的 fact/instance 添加一些附加信息以保留有关已处理对象的信息:

CLIPS> (clear)
CLIPS>    
(defclass STUDENT
   (is-a USER)
   (slot id)
   (slot full-name)
   (slot processed (default no)))
CLIPS>    
(definstances people
   (of STUDENT (id 102) (full-name "Fred Jones"))
   (of STUDENT (id 438) (full-name "Sally Smith"))
   (of STUDENT (id 391) (full-name "John Farmer")))
CLIPS> 
(defrule list 
   ?i <- (object (is-a STUDENT)
                 (id ?id1)
                 (processed no))
         (not (object (is-a STUDENT)
                      (id ?id2&:(> ?id1 ?id2))
                      (processed no)))
   =>
   (modify-instance ?i (processed yes))
   (printout t ?id1 " " (send ?i get-full-name) crlf))
CLIPS> (reset)
CLIPS> (run)
102 Fred Jones
391 John Farmer
438 Sally Smith
CLIPS> 

或者您可以对 RHS 上的值进行排序:

CLIPS> (clear)
CLIPS> 
(defclass STUDENT
   (is-a USER)
   (slot id)
   (slot full-name))
CLIPS>    
(definstances students
   (of STUDENT (id 102) (full-name "Fred Jones"))
   (of STUDENT (id 438) (full-name "Sally Smith"))
   (of STUDENT (id 391) (full-name "John Farmer")))
CLIPS>    
(deffunction id-sort (?i1 ?i2)
   (> (send ?i1 get-id) (send ?i2 get-id)))
CLIPS>    
(defrule list
   =>
   (bind ?instances (find-all-instances ((?i STUDENT)) TRUE))
   (bind ?instances (sort id-sort ?instances))
   (progn$ (?i ?instances)
      (printout t (send ?i get-id) " " (send ?i get-full-name) crlf)))
CLIPS> (reset)
CLIPS> (run)
102 Fred Jones
391 John Farmer
438 Sally Smith
CLIPS>