Пример 10.5. Ограничение запросом для группового поля
(defmethod foo
(($?any (> (length$ ?any) 2)))
TRUE)
(foo 1 red 3)
Кроме того, если у метода нет обязательных параметров (как в предыдущем примере) и функция вызвана без аргументов, заданные ограничения группового параметра не рассматриваются. Например, метод из примера 10.5 можно применить к следующему вызову родовой функции (метод успешно вызовется и вернет значение true): (foo).
Как правило, ограничения запросом применяют ко всему групповому параметру для проверки мощности (числа аргументов, переданных методу). В таких случаях первое поле группового аргумента выносится в обязательный параметр (если это возможно). Приведенный выше пример можно усовершенствовать.
Пример 10.6. Улучшенная версия функции foo
(defmethod foo
((?arg (> (length$ ?any) 1)) $?any)
TRUE)
Теперь попытка вызова функции (foo) без параметров закончится ошибкой.
Родовое связывание
В момент вызова родовой функции CLIPS выбирает метод с наивысшим приоритетом, для которого удовлетворяются все ограничения параметров. Этот метод выполняется, и его значение возвращается как значение родовой функции. Такой процесс называется родовым связыванием.
Применимость методов
Явный (определенный пользователем) метод применим к вызову родовой функции при следующих трех условиях:
Ø имя совпадает с именем родовой функции;
Ø метод принимает не меньше аргументов, чем родовая функция;
Ø каждый аргумент родовой функции удовлетворяет соответствующим ограничениям параметров метода.
Ограничения метода рассматриваются слева направо. Как только будет найдено одно ограничение, не удовлетворяющее некоторому параметру, метод забраковывается, и оставшиеся ограничения не рассматриваются.
При перегрузке стандартной системной функции CLIPS создает неявный метод с определением соответствующей системной функции. Этот неявный метод получает ограничения аргументов благодаря вызову внутренней системной функции DefineFunction2 (более детальную информацию о данной функции можно найти в книге "CLIPS Reference Manual, Volume II, Advanced Programming Guide'}. Строка с соответствующими ограничениями также может быть получена с помощью функции get-function-restriction. Определение неявного метода можно просмотреть функциями list-defmethods или get-method-restrictions.
Перечисленные ниже системные функции нельзя перегрузить. CLIPS сгенерирует сообщение об ошибке при попытке их перегрузки.
Дата добавления: 2021-12-14; просмотров: 344;