年龄规则未正确执行

时间:2015-10-15 02:15:32

标签: jess

我试图触发这两个规则,但我得到两个规则的相同输出。   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))

我没有错误但是(print-all-persons)规则没有被执行。我错过了什么吗?请建议。

This is the new output I am getting

1 个答案:

答案 0 :(得分:0)

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

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

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

(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)
)