Имя функции должно быть символом в CLIPS. - PullRequest
0 голосов
/ 08 мая 2020

Я не могу понять, что не так в этом простом фрагменте кода:

(deftemplate justanumber "a simple integer number, nothing more"
    (slot val (type INTEGER))
)

(deffacts some_numbers
    (justanumber (val 3) )
    (justanumber (val 5) )
    (justanumber (val 7) )
)


(deffunction prec "print the given number and all numbers down to zero included, recursively"
    (?x)
    (if (or (not (integerp ?x)) (< ?x 0)) then
        (printout t "NaN or negative Error!" crlf)
    else
        (printout t "your number: " ?x crlf)
        (if (> ?x 0) then 
            (prec(- ?x 1))
        )
    )
)

(defrule printtt-numbbb "simply prints an existing number"
    (justanumber (val ?n))
=>
    (printout t "printing " ?n crlf)
    (prec(?n))
)

Когда я пытаюсь прочитать исходный файл, интерпретатор печатает это сообщение (в конце есть ошибка):

Defining deftemplate: justanumber
Defining deffacts: some_numbers
Defining deffunction: prec
Defining defrule: printtt-numbbb 
[EXPRNPSR1] A function name must be a symbol

ERROR:
(defrule MAIN::printtt-numbbb "simply prints a number"
   (justanumber (val ?n))
   =>
   (printout t "printing " ?n crlf)
   (prec (?n
FALSE

Что вызывает эту ошибку?

РЕДАКТИРОВАНИЕ И РЕШЕНИЕ: Я выяснил ошибку (и решение): при написании prec(?n) Clin go считает, что (?n) - это вызов функции, но ?n не имя функции (это переменная). Таким образом, решение состоит в том, чтобы просто удалить скобки до и после ?n, поэтому правильный код:

(defrule printtt-numbbb "simply prints an existing number"
    (justanumber (val ?n))
=>
    (printout t "printing " ?n crlf)
    (prec ?n )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...