年龄规则未正确执行

Age rule is not getting executed properly

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

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

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

要同时存储多个人的年龄和性别,可以使用如下模板。加个名字,以便在插入两个相同性别和年龄的üerson时有区别。

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

编辑

来自评论的 Q1:模板(顾名思义)只是一个 "blueprint" 事实,您可以根据需要声明任意数量。

来自评论的 Q2:如果您添加如下规则,它将在节目结束时打印所有人物事实。请注意低显着性 - 如果您省略它,则在断言事实后立即打印输出。

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