2016-12-02 57 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

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