2016-05-17 21 views
0

我需要在CLIPS中建立OneToMany關係。 我有可能與區域有關的房間。 所以我寫了:OneToMany關係和在CLIPS中添加元素的方法

(defclass ROOM (is-a USER) 
(slot id 
    (type SYMBOL))  
(slot zone 
    (type SYMBOL))) 


(defclass ZONE (is-a USER) 
(slot id-zone 
    (type SYMBOL)) 
(multislot rooms 
    (type INSTANCE) (create-accessor read-write)) 
(slot room-count 
    (type INTEGER))) 

只要我如一個新的空間,應該添加到區域中(如果該房被關聯到它)。 我寫了這個處理程序:

(defmessage-handler ZONE add-room-to-zone (?room) 
(bind ?self:rooms ?room) ;#1 
(bind ?self:room-count (length$ ?self:rooms)) 
(printout t "Room [" ?room "] added to zone [" ?self "]" crlf))) 

規則,做的動作是:

(defrule build-air-temperature-zone 
?room <- (object (is-a ROOM) (id ?id) (id-zone ?id-zone-room)) 
(test (symbolp ?id)) 
?zone <- (object (is-a ZONE) (id-zone ?id-zone)) 
(test (eq ?id-zone ?id-zone-room)) 
=> 
(send ?zone add-room-to-zone ?room) 

如果我實例的多個房間我看到的只有一個實例添加到我區。 如果認爲這是因爲#1(在處理程序中),它只是設置房間,並沒有添加它。

有沒有一種方法來增加多時隙字段中的元素?

感謝 尼克

回答

1

定義你的消息處理程序是這樣的:

(defmessage-handler ZONE add-room-to-zone (?room) 
    (bind ?self:rooms ?self:rooms ?room) 
    (bind ?self:room-count (length$ ?self:rooms)) 
    (printout t "Room [" ?room "] added to zone [" ?self "]" crlf)) 

或者這樣:

(defmessage-handler ZONE add-room-to-zone (?room) 
    (slot-direct-insert$ rooms 1 ?room) 
    (bind ?self:room-count (length$ ?self:rooms)) 
    (printout t "Room [" ?room "] added to zone [" ?self "]" crlf))