如果发现事实,CLIPS的事实处理的返回值是多少?

时间:2019-01-25 14:15:36

标签: clips

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

1 个答案:

答案 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))