Приоритет методов

Когда два или более метода применимы к некоторому вызову родовой функции, CLIPS выполняет метод с наивысшим приоритетом. Приоритет метода определяется в момент его создания. Для того чтобы просмотреть приоритеты существующих методов, можно воспользоваться функцией list-defmethods (см. гл. 15).

Приоритет определяется сравнением ограничений параметров для пар мето­дов. Метод с большим числом заданных ограничений параметров имеет больший приоритет. Кроме того, CLIPS учитывает диапазон значений, за­даваемых приоритетом. Например, метод, который требует наличие типа integer, для некоторого аргумента имеет больший приоритет, чем метод, который требует для этого аргумента тип number. Ниже приведены правила, используемые CLIPS для определения приоритета между двумя методами.

1. Последовательно, слева направо сравниваются ограничения параметров обоих методов. Другими словами, первое ограничение параметра первого метода сравнивается с первым ограничением параметра второго метода и т. д. Сравнение между этими парами ограничений параметров двух методов определяет приоритет между двумя методами. Сравнение прекращается, как только будет найдена первая пара ограничений, однозначно определяющая метод с более высоким приоритетом. Для сравнения пар ограничений параметров применяются следующие правила в указанном порядке:

Ø обязательные параметры имеют более высокий приоритет, чем групповой параметр;

Ø более строгие ограничения типа имеют более высокий приоритет. Например, класс имеет больший приоритет, чем его суперкласс;

Ø параметр с ограничением запроса имеет приоритет выше, чем параметр, который его не имеет.

2. Метод с большим числом постоянных параметров имеет больший приоритет.

3. Метод без групповых параметров имеет более высокий приоритет, чем метод с групповыми параметрами.

4. Если метод определен раньше другого, то первый метод имеет более высокий приоритет.

Если в одном ограничении задано несколько классов, определение приоритета усложняется. Поскольку определение приоритетов выполняется в момент создания нового метода, а конкретный класс аргумента станет извес­тен только в момент вызова родовой функции, то для определения приори­тета методов со списком классов в ограничении типа необходим специальный алгоритм для определения приоритета между двумя списками классов. В этом случае списки классов рассматриваются парами слева направо. Приоритет определяет первая пара, содержащая класс и его супер­класс. Список классов, содержащий класс, имеет более высокий приоритет, чем список, содержащий суперкласс данного класса. Если таких пар нет, то более приоритетным считается самый короткий список. В случае если при­оритет списка классов установить не удалось, то ограничение параметра, использующее этот список классов, не рассматривается при определении приоритета метода.

Рассмотрим процесс определения приоритета методов на нескольких примерах.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: