年龄规则未正确执行
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) 规则没有被执行。我错过了什么吗?请多多指教。
您在整个事实 (?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)
)
我正在尝试触发这两个规则,但我得到的这两个规则的输出相同。 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) 规则没有被执行。我错过了什么吗?请多多指教。
您在整个事实 (?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)
)