2016-12-02 56 views
0

我正在嘗試使用CLIPS創建一個家族樹程序。忽略Defrule CLIPS中的類似事實

我對CLIPS非常陌生,並且正在面對我在defrule之一中創建的某個操作遇到的困難。

我試圖執行的操作是爲彼此的兄弟姐妹的孩子創建事實。因此,對於每對兒童,我希望該計劃產生2新的兄弟姐妹事實。但該程序似乎生成4 - 這也是列出每個孩子作爲自己的兄弟 ...

我試過谷歌搜索解決方案,但我想不出如何要求計算機不開火,如果?cn ==?sn)。

有人可以幫忙嗎?

(deftemplate siblings 
    (slot subject-name) 
    (slot sibling-name) 
) 

(defrule set-siblings 
    (child 
     (child-name ?cn) 
     (parent-name ?p)) 
    (child 
     (child-name ?sn) 
     (parent-name ?p)) 
    => 
    (assert (siblings 
      (subject-name ?cn) 
      (sibling-name ?sn)) 
) 

回答

0

修改你的第二個模式,這樣匹配孩子的名字必須比第一圖案綁定的名稱不同:

(defrule set-siblings 
    (child 
     (child-name ?cn) 
     (parent-name ?p)) 
    (child 
     (child-name ?sn&~?cn) 
     (parent-name ?p)) 
    => 
    (assert (siblings 
      (subject-name ?cn) 
      (sibling-name ?sn)) 
) 
+0

謝謝!這有幫助!^_^ 但是,請你告訴我這個邏輯操作是如何工作的? –

+0

「基本編程指南」的第5.4節介紹了模式約束,http://clipsrules.sourceforge.net/documentation/v630/bpg.pdf。 –

+0

非常感謝,先生!^_ ^ –