Определение 10.2. Синтаксис конструктора defmethod
(defmethod <имя-функции>
[<индекс>]
[<комментарии>]
(<ограничения-параметра>*
[<групповой-параметр>])
<действие>*)
<ограничения-параметров> ::= <простая-переменная> |
(<простая-переменная>
<ограничение-по-типу> *
[<ограничение-по-запросу>])
<групповой-параметр> ::= <составная-переменная> |
(<составная-переменная>
<ограничение-по-типу>*
[<ограничение-по-запросу >])
<ограничение-по-типу> ::= <имя-класса>
<ограничение-по-запросу> ::= <глобальная-переменная> |
<вызов-функции>
Родовая функция должна быть либо явно объявлена конструктором defgeneric, либо одним из своих методов, до того как она будет вызвана из другой функции, правила или обработчика сообщения. Исключение составляют рекурсивные родовые функции.
Заголовок родовой функции
Родовая функция однозначно определяется по своему имени. В случае использования родовой функции в правиле, другой функции, обработчике сообщения или до объявления первого метода родовой функции необходимо явное создание заголовка родовой функции (с помощью конструктора defgeneric). В других случаях объявление первого метода родовой функции само не явно создает заголовок. Например, в случае если две родовые функции имеют методы, которые взаимно вызывают друг друга (взаимная рекурсия родовых функций), то необходимо явное объявление заголовков.
Индексы методов
Метод родовой функции однозначно определяется либо по имени и индексу, либо по имени и ограничениям параметров. Каждому методу родовой функции назначается целый индекс, уникальный в группе всех методов этой функции. В случае если определен новый метод, который точно совпадает по ограничениям параметров и имени с другим методом этой функции, CLIPS автоматически заменит им существующий метод. Однако малейшее несовпадение в ограничениях параметров приведет к созданию нового метода. Если нужно заменить некоторый уже существующий метод новым методом с другими ограничениями параметров, то в определении нового метода необходимо явно указать индекс существующего метода. При этом ограничения параметров нового метода должны не совпадать с ограничениями других методов той же функции. Если индекс не задан, CLIPS автоматически назначает индекс, который еще не был использован другими методами родовой функции. Индекс, соответствующий методам родовой функции, можно определить, например, с помощью команды list-defmethods (см. гл. 16).
Дата добавления: 2021-12-14; просмотров: 284;