2013-05-15 70 views
0

假設您正在給一組按照下面的結構定義的「人」的事實:創建CLIPS規則從未知移到稱爲人的事實

(deftemplate person (slot name) (slot sex) (allowed-values male female) (multislot children)) 

編寫規則來執行以下操作:

  • 創建表單(未知的人)對出現在孩子們的多時隙一個人的事實,但沒有任何人其實名插槽(假定沒有任何兩個人有各自名字的事實同名)
  • 對於每個形式的事實(未知人)向用戶詢問該人的性別,收回事實並聲明該形式的新事實(未知人)。
  • 對於表格中的每個事實(未知人),收回事實併爲該人創建一個新的人物事實(假定該人沒有孩子)。

你的規則應該做的數據驗證,以確保僅由用戶

回答

0

提供的允許值定義在CLIPS模板:

(deftemplate person 
    (slot name) 
    (slot sex) 
    (slot gender (allowed-values male female)) 
    (multislot children)) 

開始與未知的人創建(警告:這可能不完全正確,因爲它仍然創建一個人而不檢查它們是否存在)。

(defrule childrencataloguer "First layer of unknown person resolution" 
    (person (children $?ch)) 
    => 
    (progn$ (?term ?ch) 
     (assert (unknown-person ?term)) 
    )) 

處理警告以上

(defrule removeunknownswithpersonsalready 
    (person (name ?n)) 
    ?up <-(unknown-person ?n) 
    => 
    (retract ?up)) 

現在,讓性別:

(defrule getgender 
    ?up-nogen <-(unknown-person ?n) 
    => 
    (retract ?up-nogen) 
    (printout t crlf "Please enter male or female to indicate " ?n "'s gender" crlf) 
    (assert (unknown-person ?n (read))) 
) 

還有其他的方法可以做到性別確認,我也喜歡使用deftemplate本身,因此允許的值將會進入驗證。但我現在還不知道。

(assert (gender male)) 
(assert (gender female)) 

現在,做驗證:

(defrule checkgender 
    ?p <- (unknown-person ?n ?s) 
    (not (gender ?s)) 
    => 
    (retract ?p) 
    (assert (unknown-person ?n)) 
) 

最後,從未知

(defrule graduatefromunknown 
    (declare (salience -10)) 
    ?up <- (unknown-person ?n ?s) 
    => 
    (retract ?up) 
    (assert (person (name ?n) (sex ?s))) 
) 
研究生