Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Пример 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 сгенерирует сообщение об ошибке при попытке их перегрузки.
|