2017-08-14 1 views
1

Y at-il un moyen d'obtenir les objets dans les clips dans l'ordre du côté LHS basé sur un emplacement particulier en classe?comment obtenir les objets dans les clips dans l'ordre du côté LHS basé sur un emplacement particulier dans la classe

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

si j'ai 100 objets SAMPLE, et je veux tous à venir dans l'ordre croissant en fonction de l'ID de l'emplacement de la partie gauche d'une règle, est-ce poosilbe dans les clips?

Répondre

2

Vous pouvez trier les objets de deux manières. Vous pouvez le faire sur le LHS en ajoutant des informations supplémentaires soit à des objets ou un fait/instance distincte de conserver des informations sur les objets ont été traités:

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> 

Ou vous pouvez trier les valeurs de l'ERS:

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> 
+0

Gary - merci pour cette réponse détaillée. J'étais sur le point de demander la même chose :) – Bernie

+0

Merci Gary, j'ai aimé l'approche de tri et l'ai fait et ça marche bien. – naren