在 CLIPS 中提到了that
(defrule example
(forall (a ?x) (b ?x) (c ?x))
=>)
相当于
(defrule example
(not (and (a ?x)
(not (and (b ?x) (c ?x)))))
=>)
我无法理解转换,这是否意味着:我们不需要有“a”但后面没有“b”后面没有“c”或后面的情况?
此外还有以下事实
(deffacts students
(person "a")
(person "l")
(student "a")
(student "l")
(student "f")
(has-laptop "a")
(has-laptop "l")
(has-laptop "f")
(part-time "a")
(part-time "l")
(part-time "f")
)
以及以下规则
(defrule example
(forall (person ?x) (student ?x) (has-laptop ?x) (part-time ?x))
=> (printout t "yes " crlf))
(运行)后的输出是“是”,即使没有(人“f”)
我不确定我是否完全理解
forall 的行为没有任何细微差别。它的行为方式与类似的布尔表达式相同。所以如果你有这个布尔表达式:
not (A and (not (B and C)))
且 A 为假,则表达式的计算结果将为真。同样的行为也适用于您的规则;如果没有人,则匹配forall。
然而,语言可能有细微差别。如果我问今天的所有订单是否都已处理,我希望答案是“是”或“否”。如果没有订单,那么答案仍然是肯定的,尽管有人可能会提供额外的信息。 “我们没有订单,所以是”仍然是“是”。
如果我问某人是否所有的宠物都接种了疫苗并植入了芯片,我也希望答案是“是”或“否”,但我认为没有宠物的人更有可能提供额外的信息,也许是因为问题在某种程度上暗示被问者至少有一只宠物。
因此,如果您使用 forall,但希望至少有一个事实与 forall 中的第一个模式匹配,则必须向规则添加一个附加模式:
(defrule all-safe
(exists (pet ?))
(forall (pet ?pet)
(vaccinated ?pet)
(chipped ?pet))
=>
(println "All pets are vaccinated and chipped."))