CLIPS reference manual解释了关于do-for-fact
的信息:
如果事实满足 查询后,将执行指定的操作,并且该函数将立即终止。的 返回值是对动作的评估。如果没有事实集满足查询,则返回值 是符号FALSE。
但是,我无法找到有关“评估行动”总体含义的任何细节。
如果发现事实,可以安全地假设do-for-fact
总是返回不等于FALSE
的值吗?
以下代码段正确吗?
(if (not (do-for-fact ((?p1 girl boy woman man)
(?p2 girl boy woman man)
(?p3 girl boy woman man))
(and (= ?p1:age ?p2:age ?p3:age)
(neq ?p1 ?p2)
(neq ?p1 ?p3)
(neq ?p2 ?p3))
(printout t ?p1:name " " ?p2:name " " ?p3:name crlf)))
then
(printout t "Nobody found" crlf)
)
答案 0 :(得分:1)
动作是指函数语法的BNF描述:
(do-for-fact <fact-set-template> <query> <action>*)
此动作术语与功能主体中使用的术语相同:
(deffunction <name> [<comment>]
(<regular-parameter>* [<wildcard-parameter>]) <action>*)
两种情况下的返回值都是最后评估的动作。如果最后评估的操作返回值FALSE,则按事实函数将返回值FALSE,就像没有事实集满足查询的情况一样。
在您的示例中,打印输出函数没有返回值,该返回值被not函数视为非FALSE值,因此它将按您期望的那样工作
CLIPS> (printout t)
CLIPS> (not (printout t))
FALSE
CLIPS>
如果在打印输出调用之后添加了符号FALSE,则事实调用的返回值将始终为FALSE,而不管任何事实集是否满足查询要求。
(printout t ?p1:name " " ?p2:name " " ?p3:name crlf)
FALSE))