Каково возвращаемое значение фактических данных CLIPS, если факт был найден? - PullRequest
0 голосов
/ 25 января 2019

Справочное руководство CLIPS объясняет о 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 голосов
/ 25 января 2019

Действие относится к BNF-описанию синтаксиса функции:

(do-for-fact <fact-set-template> <query> <action>*)

Этот термин действия является тем же самым термином, который используется в теле деформации:

(deffunction <name> [<comment>]
   (<regular-parameter>* [<wildcard-parameter>]) <action>*)

Возвращаемое значение в обоих случаях является последним оцененным действием. Если последнее оцененное действие возвращает значение FALSE, то функция do-for-fact возвращает значение FALSE так же, как если бы не было набора фактов, удовлетворяющего запросу.

В вашем примере функция распечатки не имеет возвращаемого значения, которое не-функция обрабатывается как не-FALSE, поэтому она будет работать так, как вы ожидаете

CLIPS> (printout t)
CLIPS> (not (printout t))
FALSE
CLIPS> 

Если бы вы включили символ FALSE после вызова распечатки, то возвращаемое значение для проверки факта всегда будет FALSE независимо от того, удовлетворял ли запрос какой-либо набор фактов.

(printout t ?p1:name " " ?p2:name " " ?p3:name crlf)
FALSE))
...