我有这些事实
(person "Mark")
(person "Nail")
(person "Stark")
(person "Maria")
(married "Stark" "Maria")
我定义了以下规则
(defrule single
(not (married ?x ?))
(not (married ? ?x))
=> (assert (single ?X)))
这给了我以下错误:
如果 defrule 则未定义变量 ?x 在 RHS 中引用
一切正常,为什么我使用这个:
(defrule single
(person ?x)
(not (married ?x ?))
(not (married ? ?x))
=> (assert (single ?X)))
为什么?
非条件元素(CE)是存在查询。它检查是否没有与 CE 匹配的事实。如果没有任何内容与非 CE 匹配,则该 CE 内部绑定的变量在 CE 外部没有任何意义。
此对话说明了您的第一条规则的问题:
Person 1: Do you know anyone who's married?
Person 2: No.
Person 1: OK, then that person is single.
“那个人”这个短语在这里没有意义,因为“任何人”并不指特定的人。
您的第二条规则有效,因为第一个模式与后续模式可以引用的特定人员相匹配:
Person 1: Do you know a person?
Person 2: Yes.
Person 1: Is that person married?
Person 2: No.
Person 1: OK, then that person is single.