我试图触发这两个规则,但我得到两个规则的相同输出。 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)规则没有被执行。我错过了什么吗?请建议。
答案 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)
)