理解 CLIPS 中的(forall)条件元素

问题描述 投票:0回答:1

在 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”)

我不确定我是否完全理解

clips expert-system
1个回答
0
投票

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."))
© www.soinside.com 2019 - 2024. All rights reserved.