ГЛАВА 10. Родовые функции
Помимо функций, описанных в гл. 8, CLIPS предоставляет еще один механизм, поддерживающий процедурную парадигму представления знаний, — родовые функции. Родовые функции подобны функциям, созданным с помощью конструктора deffunction. Они также могут использоваться для определения нового процедурного кода в CLIPS и могут быть вызваны как любые другие функции. Однако, в отличие от простых, родовые функции являются более мощным средством обработки данных, т. к. они способны выполнять различные наборы действий в зависимости от числа и типа полученных в данный момент аргументов. Родовые функции подобны перегруженным операторам или функциям языка C++. Например, функция + может выполнять как операцию конкатенации строк, так и простое арифметическое сложение чисел. Родовые функции определяются с помощью конструкторов defgeneric и defmethod, которые подробно будут описаны В данной главе. Родовые функции обычно состоят из нескольких компонентов, называемых методами. Каждый метод определяет последовательность действий, выполняющих обработку различных наборов аргументов. Родовая функция, которая имеет более одного метода, называется перегруженной.
Родовые функции могут содержать как системные методы, так и методы, определенные пользователем. Например, перегруженная функция + состоит из двух методов:
Ø неявный метод, являющийся системной функцией, которая обрабатывает арифметическое сложение;
Ø явный (определенный пользователем) обработчик сложения строк.
CLIPS не позволяет использовать функции, созданные с помощью конструктора deffunction, в качестве методов родовых функций. Конструкторы deffunction предоставляют возможность добавления в CLIPS новых функций без использования концепции перегрузки. Родовая функция, имеющая только один метод, по своему поведению идентична функции, созданной с помощью конструктора deffunction.
В большинстве случаев методы родовых функций не вызываются напрямую, несмотря на то, что CLIPS предоставляет такую возможность с помощью функции call-specific-method (см. гл. 15). CLIPS самостоятельно распознает вызов родовой функции и использует аргументы для поиска и запуска соответствующего метода. Этот процесс называется родовым связыванием.
10.1. Замечание относительно термина "метод"
Большинство объектно-ориентированных систем поддерживают процедурное поведение объектов через обработку сообщений (например, Smalltalk) или с помощью родовых функций (например, CLOS). Можно утверждать, что CLIPS поддерживает оба этих механизма, несмотря на то, что родовые функции и не являются составной часть языка COOL (объектно-ориентированный язык, поддерживаемый CLIPS) и могут использоваться без него. Родовые функции могут использовать классы в качестве аргументов своих методов, но они должны обеспечивать выдачу сообщений для манипуляции с объектами таких классов. (Изучением языка COOL мы займемся в следующей главе.)
Поддержка системой CLIPS обоих механизмов приводит к путанице в терминологии. В объектно-ориентированных системах, которые поддерживают только обработку сообщений, термин "метод" применяется для определения сообщения, реализованного в другом классе, по отношению к рассматриваемому. В системах, где поддерживаются только родовые функции, термин "метод" служит для определения различных реализаций поведения родовой функции.
Во избежание подобной путаницы в дальнейшем для указания на реализацию обработки сообщения в некотором классе будем использовать термин "обработчик сообщений". Термин "метод" станет употребляться только в контексте родовых функций.
Дата добавления: 2021-12-14; просмотров: 301;