2015-10-15 35 views
0

我试图触发这两个规则,但我得到了两个规则相同的输出。 This is the output i am getting for both.年龄规则没有得到正确执行

(defrule old-male 
    ?gender <- (gender m) 
    ?age <- (age ?age&:(> ?age 35)) 
     => 
     (printout t "Person is male & older. This Person must go after older females!" crlf) 
     (retract ?gender) 
     (retract ?age) 
     (ask-start-again)) 

(defrule young-male 
?gender <- (gender m) 
?age <- (age ?age&:(< ?age 35)) 
    => 
    (printout t "Person is male & younger. This Person must go after younger females!" crlf) 
    (retract ?gender) 
    (retract ?age) 
    (ask-start-again)) 

(reset) 
(run) 

请指点什么,我需要做什么来解决这个问题。

还有一种方法可以存储给出的输入(性别,年龄和姓名)并将它们与另一个人进行比较。 谢谢!

我已经添加了您建议的规则以及该列表的另一个规则。

(defrule print-solution 

    => 
    (printout t "Name Age Gender" crlf) 
    (printout t "--------------------------------------" crlf)) 

我没有错误,但(打印所有人)规则没有得到执行。我错过了什么吗?友善的建议。

This is the new output I am getting

回答

0

您在绑定到整个事实(?age <- ...)和有序事实((age ?age&:...)的第一个项目使用相同的名称。只为后者使用另一个名字。

(defrule old-male 
    ?gender <- (gender m) 
    ?age <- (age ?a&:(> ?a 35)) 
=> 
    ... 

为了同时存储几个人的年龄和性别,可以使用如下的模板。添加一个名字,以便在插入两个相同性别和年龄的人时有区别。

(deftemplate person (slot gender) 
        (slot age (type INTEGER)) 
        (slot name)) 

编辑

从评论Q1:模板(顾名思义)只是一个“蓝图”的事实,你可以断言,只要你喜欢尽可能多的。

问题二:如果您添加如下规则,它会在节目结尾处打印所有人物事实。请注意,低显着性 - 如果您忽略它,只要事实被确认,打印就会发生。

(defrule print-all-persons 
    (declare (salience -1000)) 
    (person (name ?name)(gender ?gender)(age ?age)) 
=> 
    (printout t ?name " is a " ?age "-year old " 
       (if (eq ?gender f) then "fe" else "") "male" crlf) 
) 
+0

它工作。非常感谢。而且,我已经给出了与您建议的完全相同的(deftemplate)。我必须添加多个模板吗?但是对于我所拥有的代码,它会告诉“一个人何时可以去/何时去。”。当我选择'n'作为最终的问题时,它会停止。但是当我选择'n'作为最后一个问题时(比如给4个男人和4个女人后,假设),我无法弄清楚,如何显示我在列表中输入的所有人的年龄,性别,姓名。请指教。再次感谢。 –

+0

感谢您的快速回复。我会试试看看是否有效。再次感谢。 –

+0

你好,我编辑了我的问题。由于某些原因,该规则没有得到执行。请就该规则提出建议。如果我提供完整的代码来查看我做错了什么,它会有用吗? –