Помимо функций, описанных в гл. 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 обоих механизмов приводит к путанице в терминологии. В объектно-ориентированных системах, которые поддерживают только обработку сообщений, термин "метод" применяется для определения сообщения, реализованного в другом классе, по отношению к рассматриваемому. В системах, где поддерживаются только родовые функции, термин "метод" служит для определения различных реализаций поведения родовой функции.
Во избежание подобной путаницы в дальнейшем для указания на реализацию обработки сообщения в некотором классе будем использовать термин "обработчик сообщений". Термин "метод" станет употребляться только в контексте родовых функций.