Главная страница

дб. Четвертое издание джозеф Джарратано Университет Хьюстон клиэрЛэйк Гари Райли People5oft, Издательский дом "Вильямс" Москва СанктПетербург Киев 2007 ббк 32. 973. 26 018 75 Д


Скачать 3.73 Mb.
НазваниеЧетвертое издание джозеф Джарратано Университет Хьюстон клиэрЛэйк Гари Райли People5oft, Издательский дом "Вильямс" Москва СанктПетербург Киев 2007 ббк 32. 973. 26 018 75 Д
Дата19.05.2022
Размер3.73 Mb.
Формат файлаpdf
Имя файла[Dzharratano Dzhozef, Raili Gar - Nieizviestnyi.pdf
ТипДокументы
#538649
страница64 из 74
1   ...   60   61   62   63   64   65   66   67   ...   74

) В этом определении параметр представляет собой начальное значение. Результат применения команды seed для воспроизведения одинаковой последовательности случайных значений можно наблюдать на примере такого ряда команд CLIPS> (seed 30) 1 CLIPS> (roll- die)J 4 CLIPS> (roll-die)J 5 CLIPS> (roll-die)J 3 CLIPS> (seed 30)J
CLIPS> (roll-die)J 4 CLIPS> (roll-die)J 5 CLIPS> (roll-die)J 3
CLIPS>
10.7. Полезные команды и функции 841 ется несколько полей,
содержащихся в строковом параметре. Функция возвращает первое найденное поле, поле с плавающей точкой 3 . 4, и отбрасывает все остальные поля, находящиеся в этой строке.
Обратите внимание на то, что возвращенное значение не зависит от наличия в строке дополнительных пробелов. По существу вызов функции string — to- field идентичен вызову функции read, в котором строковый параметр представляет то,
что пользователь вводит с клавиатуры. Поиск символа Для отображения всех символов, определенных в системе которые содержат указанную подстроку, может использоваться команда apropos. Она имеет следующий синтаксис (apropos
) В этом определении параметр — or — string — expression> представляет собой искомую подстроку. Команда apropos может принести реальную пользу, если требуется вывести на внешнее устройство список функций или команд, в именах которых имеется общая
подстрока, или в тех случаях, когда удается вспомнить часть символа, применяемого в имени функции, команды или конструкции, ноне все имя. Например, предположим, что необходимо получить список всех функций и команд,
содержащих символ de f template: CLIPS> (apropos deftemplate)J
get-deftemplate-list deftemplate list-deftemplates undeftemplate ppdeftemplate deftemplate-module CLIPS> Сортировка списка полей Для сортировки списка полей может использоваться функция sort. Функция sort имеет следующий синтаксис (sort
*) В этом определении параметр представляет собой имя функции, конструкции de f function или универсальной функции, которая применяется для определения того, следует ли поменять местами два поля вовремя сортировки.
Оставшимися параметрами, обозначаемыми с помощью терма, могут быть либо однозначные, либо многозначные значения. Эти значения соединяются водно многозначное значение, которое затем Глава 10. Процедурное программирование сортируется.
Возвращаемым значением этой функции является отсортированное многозначное значение. В следующем примере показано, как осуществляется сортировка списка целых чисел CLIPS> (sort > 4 3 5 7 2 7) 1 (2 3 4 5 7 7) CLIPS> Область применения функции sort не ограничивается сортировкой чисел.
Например, рассмотрим следующую конструкцию de f function:
(deffunction string> (а ?b) (> (str-compare а ?b) 0)) Любая функция сравнения, используемая в сочетании с функцией должна принимать два параметра и возвращать символ если первый параметр в отсортированном списке должен стоять после второго параметра в противном случае функция сравнения должна возвращать символ FALSE. В частности,
функция str-compare возвращает положительное целое число,
если первый ее параметр лексикографически больше второго параметра, поэтому, сравнивая возвращаемое значение с Ос помощью функции >, можно воспользоваться конструкцией de f f unction с именем string> для лексикографической сортировки списка символов или строк, например, как показано ниже (sort string> ах аа bk mn ft m)J (аа ах bk ft m mn) В функции str — compare все прописные буквы трактуются как имеющие меньшее значение по сравнению со всеми строчными буквами, поэтому при сортировке смешанных комбинаций прописных и строчных букв полученный результат может отличаться от ожидаемого, как в следующем примере CLIPS>
(sort string> а С b А В с) ( (А В С ас Как показывает этот пример, все прописные буквы в результате сортировки оказались расположенными перед всеми строчными буквами.
Для того чтобы прописные и строчные буквы трактовались на равных, функцию string> можно модифицировать следующим образом (deffunction string> (а ?b) (bind ?rv (str-compare
(lowcase а) (lowcase ?b))) (if (= ?rv 0) then (> (str-compare а ?b)
0)
843 10.8. Резюме else (> ?rv 0))) В данном случае буквы в строках вначале преобразуются в строчные, а затем проводится сравнение строк. Регистр букв учитывается, только если строки равны. Как показано ниже, это приводит к получению более приемлемых результатов. CLIPS> (sort string> а С b А В с) 1 (А а
В b С с) CLIPS> При использовании функции sort необходимо учитывать еще одно важное требование, состоящее в том, что функция сравнения должна возвращать символ TRUE, только если два сравниваемых значения действительно необходимо поменять местами. Рассмотрим следующий вызов CLIPS> (sort
<> 3 4 5 6) ! В этой ситуации в функции sort вызывается функция для определения того, какие поля должны быть переставлены местами. Но ни одни из этих полей не равны,
поэтому функция <> всегда возвращает символ TRUE и сортировка никогда не заканчивается. Безусловно, следует избегать возникновения в программе такой ситуации. Резюме В конструкции def function, универсальной функции или
в правой части правила для передачи управления могут использоваться функции if, while, switch, loop- for-count, progng и break. Но злоупотребление этими функциями в правой части правила считается плохим стилем программирования. Для прекращения выполнения правил может применяться функция halt. Для определения новых функций по такому же принципу,
как ив других процедурных языках, может использоваться конструкция de f function; при этом не требуется применять компилятор С для повторной компиляции исходного кода интерпретатора CLIPS. Еще один вариант создания новых функций состоит в использовании механизма, предусмотренного в языке CLIPS, который описан в документе Advanced
Programming Guide. Этот механизм позволяет интегрировать в систему CLIPS функции, написанные на языке С, но для этого необходимо применять компилятор С, чтобы создать новый исполняемый файл CLIPS. Конструкция de f global позволяет определять переменные, которые сохраняют свои значения за пределами области действия конструкций, называемые глобальными переменными. Универсальные функции,
реализованные с помощью конструкций defgeneric и предоставляют большие возможно-
Глава 10. Процедурное программирование 844 Задачи Перезапишите следующее правило в виде одного или нескольких правил, в которых не используются функции while и if. Убедитесь в том, что составленные вами правила осуществляют те же действия, сравнив полученные результаты и окончательное состояние списка фактов при использовании составленных вами правили исходного правила. (defrule continue-check ?phase <- (phase check-continue) — ) (retract ?
phase) (printout t "Continue? ") (bind ?answer (read)) (while (and
(neq ?answer yes) (neq ?answer по) do (printout t "Continue? ")
(bind ?answer (read))) (if (eq ?answer yes) then (assert (phase continue)) else (assert (phase halt)))) сти и обладают большей гибкостью, чем конструкции de f function, поскольку позволяют
связывать многочисленные процедурные методы с общим именем универсальной функции. При вызове универсальной функции применяется механизм вызова перегруженного метода для исследования типов параметров, передаваемых в функцию,
и проверки всех соответствующих ограничений запроса для определения метода, подлежащего вызову. Кроме того, в данной главе приведено вводное описание нескольких вспомогательных функций. Функции save — facts и load- facts могут использоваться для сохранения фактов в файле и загрузки фактов из файла. Команда system позволяет вызывать на выполнение команды операционной системы из среды Команда batch дает возможность вводить последовательности команд и ответов, хранящихся в файле, вместо обычного их ввода с клавиатуры. Команды dribble — on и dribble-of f обеспечивают регистрацию информации, выводимой на терминал, для сохранения ее в файле. Для выработки случайных целочисленных значений может использоваться функция random, а для задания начального значения генератора случайных чисел предназначена функция seed. Функция string —
to-field может служить для синтаксического анализа и извлечения поля, содержащегося в строке. Команда apropos применяется для отображения всех символов, содержащих заданную подстроку. Функция sort может использоваться для сортировки списка полей.
Задачи 845 10.2. 10.3. 10.4. 10.5. 10.6. Предположим, что дана шахматная доска размерами NxN, где N — целое число.
Напишите программу, которая расставляет N ферзей на шахматной доске таким образом, что ни один ферзь не может напасть на другого. Подсказка. Вначале разработайте программу с использованием четырех вертикалей и горизонталей. Это — минимальное число, для которого существует решение (не считая тривиального случая, в котором доска имеет размеры 1 x1). Модифицируйте программу,
разработанную в результате решения задачи 9.12 (см. с. 772),
таким образом, чтобы при отсутствии кустарников,
соответствующих всем требованиям, создавался список,
состоящий из кустарников, соответствующих большинству требований. Дополнительно должно быть выведено количество выполненных требований. Модифицируйте программу,
разработанную в результате решения задачи 9.17 (см. с. таким образом, чтобы в ней использовались модули. Если не удается найти драгоценный камень, соответствующий указанным значениям цвета, твердости и плотности, программа должна сообщить об этом. После идентификации драгоценного камня программа должна предоставить пользователю возможность идентифицировать еще один драгоценный камень.
Объедините программы, разработанные в результате решения задачи (см. си. Результирующая программа должна иметь интерфейс текстового меню с пунктами меню для запуска приложения, прекращения работы приложения и выхода из программы. После выбора пункта меню, предназначенного для запуска, для пользователя должно быть выведено приглашение, чтобы он мог указать имя приложения и требования к памяти. После выбора пункта меню,
предназначенного для завершения работы приложения, для пользователя должно быть выведено приглашение, чтобы он мог указать имя завершаемого приложения. Модифицируйте программу, разработанную в результате решения задачи см. с. 774), чтобы в ней поддерживались субменю, например,
как показано ниже. CLIPS> (run) Select one of the following options: 1 — Option А 2 — Option В 3 — Submenu 1 9 — Quit
Program Your choice: 3 Select one of the following options: 1 —
Option С Глава 10. Процедурное программирование 2 — Option D 9 —
Previous Menu Your choice: 9 Select one of the following options: 1
— Option А 2 — Option В 3 — Submenu 1 9 — Quit Program Your choice: 9 CLIPS> Таблица 10.1. Исходные данные для задачи Более предпочтительные Предмет Более предпочтительное Менее предпочтительные Менее предпочтительное преподаватели время проведения занятий преподаватели время проведения занятий История Техаса 2,5 1,3 Хилл Алгебра Физкультура Химия Смит 1,2 Джоунз Мак, Кинг
Долби 5,6 3,4 Литература Немецкий язык 1,6 Модифицируйте программу, разработанную в результате решения задачи 9.18 (см. с. 775), таким образом, чтобы она позволяла составлять расписание занятий по шести предметам для одного учащегося. Программа должна предпринимать попытки максимизировать общую оценку (как описано в условиях задачи 9.18) для всех шести предметов. Входные данные программы должны состоять из шести фактов с указанием предметов, которые должны быть включены в расписание, а выходные данные должны представлять собой список предметов, включенных в расписание в порядке следования времени проведения занятий от одного до шести.
Проверьте функционирование разработанной вами программы на примере выбора предметов, показанного в табл. Задачи 847 Предположим, что игрок в покер только что обновил свои пять карт. Напишите программу, которая после получения входных фактов, представляющих эти пять карт, выводит на внешнее устройство обозначение типа комбинации карт на руках игрока флэш ройял (десятка, валет, дама, король и туз одной масти, флэш стрит (комбинация карт, представляющая собой одновременно флэш и стрит), карэ (четыре карты одного ранга, полный дом (три карты одного ранга плюс две карты другого ранга, флэш (все карты одной масти, стрит
(комбинация карт, идущих по старшинству непосредственно одна за другой, необязательно одной масти, трио (три карты одного ранга, две пары (две карты одного ранга плюс две карты другого ранга, одна пара (две карты одного ранга) или ничего. Напишите программу, которая упрощает алгебраические уравнения, перемещая все константы в правую часть уравнения, а все переменные — в левую часть уравнения, после
чего сокращает общие члены. Например, следующее уравнение. 2x+ y+ 5+ 3y — 2z — 8 = 3z — 4y+ 4 после упрощения должно принять такой вид 2x+ 8y — 5z = 7 Поскольку знак имеет в шаблонах специальное значение, по-видимому,
потребуется представить уравнение в таком формате, что знак не указан явно, например, как показано ниже. (equation (LHS 2 х+ у + 5 + 3 угу. Объедините программы, разработанные в результате решения задачи см. си задачи 10.6, для создания интерфейса к программе определения конфигурации, действующей под управлением меню. Опции главного меню должны предоставлять возможность пользователю выбирать шасси и приспособления,
которые должны быть включены в конфигурацию, исключать приспособления из создаваемой конфигурации и выводить на внешнее устройство информацию о стоимости конфигурации.
Субменю должны использоваться для обеспечения выбора шасси, а также для включения или исключения из конфигурации различных приспособлений. После выбора шасси, добавления или удаления какого-то приспособления должны отображаться предупреждающие сообщения, если обнаруживается, что количество приспособлений превышает количество отсеков или потребность приспособлений в электроэнергии превышает возможности шасси. После этого управление должно возвращаться к главному меню. После выбора опции меню,
предназначенной для вывода информации о конфигурации,
Глава 10. Процедурное программирование 848 должен создаваться список выбранных шасси и приспособлений, наряду с указанием стоимости каждого отдельного компонента, а также суммарной стоимости всех выбранных шасси и приспособлений. Используя алгоритм, указанный в разделе разработайте конструкцию de f f unction, которая преобразует строку 137179766832525156430015 в строку "GOLD Подсказка. Для извлечения цифр из строки используйте функции sub- string и string-to-field, а затем примените флажок Ъс в
параметре функции format для преобразования числового значения в цифру. 10.12. Напишите конструкции de f f которые выполняют операции объединения и пересечения множеств применительно к двум многозначным значениям.
Обратите внимание на то, что при выполнении операций объединения и пересечения множеств необходимо исключать дублирующиеся поля из значений, возвращаемых функциями. Напишите конструкцию deffunction, которая вычисляет экспериментальное значение вероятности (как описано в разделе 4.6), полученное при выпадении единицы на шестигранной игральной кости. Параметром этой конструкции de f f unction должно быть количество бросков, а возвращаемым значением — эмпирически определенная вероятность. Напишите конструкцию de f function, которая определяет все простые числа от 1 до указанного целого числа и возвращает эти простые числа в виде многозначного значения. Напишите конструкцию de f function, которая построчно сравнивает два файла и выводит информацию об обнаруженных различиях в файл, указанный логическим именем. 10.17. Напишите конструкцию de f function, которая принимает от нуля и больше параметров и возвращает многозначное значение, содержащее значения параметров в обратном порядке. 10.18. Напишите конструкцию бей, в которой не используется рекурсия для вычисления факториала целого числа N. 10.19. Напишите конструкцию de f которая преобразовывает двоичную строку, состоящую из нулей и единиц, в десятичное число. 10.15. Напишите конструкцию de f f unction, которая определяет количество вхождений одной строки в другой строке.
Задачи 849 10.20. 10.21. 10.22. 10.23. 10.24. 10.25. Без использования функций if или switch напишите ряд методов,
предназначенных для преобразования данных, представленных с помощью таких единиц, как дюймы (inches), футы (feet) и ярды. Например, вызов (convert 3 feet inches) должен
возвращать 36. Кроме того, напишите еще один ряд методов,
предназначенных для преобразования данных, представленных с помощью таких единиц, как сантиметры (centimeters), метры) и километры (kilometers). На основе методов,
разработанных в результате решения задачи 10.20, перегрузите функцию + с помощью методов, позволяющих складывать значения длины, представленные в разных единицах измерения. Возвращаемый результат должен быть представлен в таких единицах измерения, в каких задан первый параметр метода +. Например, вызов (+ 3 feet 12 inches) должен возвратить 4. Поддерживать сложение метрических и британских единиц измерения длины пока еще не требуется.
Перегрузите функцию — с помощью метода, который удаляет поля, содержащиеся водном многозначном значении, из другого многозначного значения. Например, вызова с d)
( create$ b d f ) ) должен возвратить многозначное значение (ас. Напишите по одному методу для каждого из четырех случаев в определении функции, описанной в разделе 5.5. На основе определения степенного множества, приведенного в условиях задачи 2.11 (см. с. 190), напишите конструкцию def которая выводит на внешнее устройство каждое из множеств степенного множества, полученного на основе множества,
которое представлено в виде многозначного значения. Пробег автомобиля Джека в милях, N, выражается целым числом от 200 000 до 300 000. В десятичном представлении числа N имеется точно одна цифра О. Число N — квадрат. Сумма квадратов десятичных цифр числа N— также квадрат. Напишите одну или несколько конструкций de f function, которые определяют значение N.
Классы, экземпляры и обработчики сообщений 11.1 Введение
В языке CLIPS для представления данных, кроме фактов,
используются также экземпляры (или объекты. Экземпляры создаются на основании классов, которые определяются с помощью языка COOL (Object-Oriented Language — объектно
ориентированный язык CLIPS). Также как структура фактов задается с использованием конструкций de f template, структура экземпляров задается с применением конструкций Использование экземпляров и классов вместо фактов и конструкций deftemplate предоставляет несколько преимуществ.
Первым из них является само наследование. Конструкция def class может наследовать информацию от одного или нескольких различных классов. Это позволяет создавать более структурированные, модульные определения данных. Вторым преимуществом является то, что за объектами можно закрепить относящуюся к ним процедурную информацию с помощью обработчиков сообщений. Третьим преимуществом является то,
что сопоставление с шаблонами на основе объектов обеспечивает большую гибкость, чем сопоставление с шаблонами на основе фактов. В объектных шаблонах может использоваться наследование, сопоставление с шаблонами может осуществляться с учетом слотов, принадлежащих нескольким классам, существует возможность исключить повторную активизацию шаблона под действием изменений в незаданных слотах, а также может обеспечиваться поддержание истинности на основе значений слотов Глава 11. Классы, экземпляры и обработчики сообщений Конструкция de f class Прежде чем появится возможность создания экземпляров, в систему CLIPS необходимо передать информацию о списке допустимых слотов для данного конкретного класса. Для этой цели применяется конструкция defclass. В своей наиболее фундаментальной форме эта конструкция весьма напоминает конструкцию deftemplate:
(defclass [] (а ) *) В этом определении терм — name> определяет класс, от которого данный, вновь создаваемый класс должен наследовать информацию. Классом,
от которого в конечном итоге наследуют информацию все определяемые пользователем классы, является системный
класс USER. Определяемый пользователем класс должен наследовать информацию либо от другого определяемого пользователем класса, либо от класса USER. Синтаксическое описание определено следующим образом (slot
*) (multislot *) С помощью этого синтаксиса экземпляр person может быть описан с использованием такой конструкции de f cl as s:
(defclass PERSON "Person defclass" (is — а USER) (slot full-name)
(slot age) (slot еуе-color) (slot hair-color)) Обратите внимание на то, что в данном случае применялось имя слота full— пате, а не пате, в отличие от конструкции def template с именем приведенной в качестве примера в разделе 7.6. Как будет описано ниже, при выполнении операций сопоставления с шаблоном объекта символ пате используется в качестве зарезервированного символа, который имеет особое значение.
При определении слотов конструкции defclass могут также применяться следующие атрибуты слота из конструкции бей

етр1а:е: type, range, cardinality, allowed-symbols, allowed- strings, allowed-lexemes, allowed4ntågårs, allowed6oats, allowed- numbers, allowed-values, allowed4nstàncå-names, default и default- dynamic. Пример применения таких атрибутов показан ниже PERSON "Person defclass" (а USER)
11.3. Создание экземпляров 853 (slot пате (type STRING))
(slot age (type INTEGER) (range 0 120)) (slot еуе-color (type
SYMBOL) (allowed-values brown blue green) (default brown)) (slot hair-color (type SYMBOL) (allowed-values black brown red blonde)
(default brown))) Атрибуты слота для конструкций de йс1а з s называют также фасетами слота. 11.3 Создание экземпляров пате of пате- expression> *) В этом определении терм имеет такую форму (
) Например, ниже показано, как создать некоторые экземпляры, применяя конструкцию def class с именем person.
CLIPS> (make-instance [ЮоЬа] of PERSON (паше "John Q.

Public" ) (age 24) (еуе-color blue) (hair-color black))J [John] CLIPS>
(make-instance of PERSON)J [gen1] CLIPS> (make-instance Jack of PERSON)J [Jack] CLIPS> (instances)J [John] о Экземпляры создаются с использованием команды make4néàïñå. Команда make — instance имеет следующий синтаксис:
Глава 11. Классы, экземпляры и обработчики сообщений 854
[gen1] of PERSON [Jack] of PERSON For а total of 3 instances.
CLIPS> Также как и факты, и соответствующие им конструкции бей, экземпляры принадлежат к модулю, в котором определены соответствующие им конструкции def class (см.
раздел 11.16). Если задается необязательный параметр с именем модуля, то с помощью команды instances создается только список экземпляров, содержащихся в указанном модуле.
Если вместо имени модуля задается символ *, тов список включаются все экземпляры. А если также задается необязательное имя класса, то перечисляются только экземпляры„принадлежащие к этому классу. Наконец, если указывается также необязательное ключевое слово inherit, то перечисляются и все экземпляры, принадлежащие подклассам класса с заданным именем (см. раздел 11.6). 11.4 Обработчики сообщений, определяемые системои За классами можно закрепить не только данные, но и процедурную информацию.
Процедуры, входящие в состав классов, называются обработчиками сообиений. Для каждого класса, кроме обработчиков сообщений, определяемых пользователем,
автоматически создается также целый ряд обработчиков сообщений, определяемых системой. Эти обработчики сообщений можно вызывать для работы с некоторым экземпляром с помощью команды send. Команда send имеет следующий синтаксис (send *) В этом примере были созданы три экземпляра с именами экземпляров [ John ], [gen1] и [ Если при создании экземпляра не указывается имя экземпляра
то система задает имя автоматически (имеющее примерно такой формат, как [gen1], приведенный в данном примере. Как показывают эти вызовы команды make — instance, для данной команды не имеет значения, заключено ли имя экземпляра в квадратные скобки, [], или нет, те. имя экземпляра может быть указано и как [ John], и как Jack. Команда instances, показанная в этом примере, аналогична команде facts, если не считать того,
что при ее использовании отображается список экземпляров. В
данном случае вместе с экземплярами значения слотов не отображаются, нов следующем разделе показано, как это можно сделать. Полный синтаксис команды instances приведен ниже. (instances [ [ [inherit]]])
11.4. Обработчики сообщений, определяемые системой Например, сообщение print отображает информацию о слотах экземпляра CLIPS> (send [John] print)J [John] of PERSON (full- name "John Q. Public" ) (age 24) (еуе-color blue) (hair-color black)
CLIPS> Для каждого слота, определяемого в конструкции бей, система CLIPS автоматически определяет обработчики сообщений слота с префиксами get- и put-, которые используются для выборки и задания значений слота.
Действительные имена обработчиков сообщений формируются в результате добавления к этим префиксам имени слота.
Поэтому, например, конструкция defclass с именем имеющая слоты full — пате, age, еуе-color и hair — автоматически создается для данного класса с восемью обработчиками сообщений, имеющими имена get — full — пате — пате, get — age, put — age, get — еуе — color, put-eye- color, get-hair-color и put-hair-color. Обработчики сообщений get
— не имеют параметров и возвращают значение слота,
например, как показано ниже. CLIPS> (send [John] get-full-name)J
" лойп Q. Public" CLIPS> (send [John] де -age)J 24 Обработчики сообщений put — принимают от нуля и больше параметров. Если параметры не задаются, то восстанавливается первоначальное, предусмотренное по
умолчанию значение слота, а при передаче одного или большего количества параметров значение слота устанавливается с учетом этих параметров. Попытка поместить больше одного значения в однозначный слот приводит к возникновению ошибки. Обработчик сообщений put — возвращает значение,
представляющее собой новое значение слота, например, как показано в следующем диалоге CLIPS> (send [Jack] get-age)J nil
CLIPS> (send [Jack] put-age 22) 1 22 CLIPS> (send [ Jack] get-age)
J 22 CLIPS> (send [Jack] put-age)J nil
856 Глава 11. Классы, экземпляры и обработчики сообщений (send [Jack] get-age)J nil CLIPS> Команда watch принимает в качестве параметров несколько элементов,
подлежащих отслеживанию, которые относятся к данному экземпляру. Одним из таких элементов является slots (слоты).
Если осуществляется отслеживание слотов, то при каждом изменении значения любого слота экземпляра выводится информационное сообщение. Отслеживание изменений в слотах можно отменить с помощью команды unwatch: CLIPS>
(watch slots)J CLIPS> (send [Jack] put-age 24) ::= local slot age in instance Jack <- 24 24 CLIPS> (unlatch slots)J CLIPS> (send [Jack]
put-age 22)J 22 CLIPS> Еще одним заранее определенным обработчиком сообщений является delete. Как и можно было бы предположить, обработчик сообщений delete используется для удаления экземпляра. Он возвращает символ TRUE, если экземпляр был успешно удален, в противном случае — символ CLIPS> (instances)J [John] о PERSON [gen1] of PERSON
[Jack] of PERSON For а total of 3 instances. CLIPS> (send [gen1]
delete)J TRUE CLIPS> (instances)J [John] о PERSON [Jack] of
PERSON For а total of 2 instances. CLIPS> Еще одним отслеживаемым элементом является instances (экземпляры).
Если отслеживаются экземпляры, то система автоматически выводит сообщение каждый раз, когда создается или удаляется экземпляр. В отличие оттого, какие действия выполняются при модификации значения слота факта, при
модификации значения слота экземпляра не создается новый экземпляр с изменившимся значением и не удаляется первоначальный экземпляр, поэтому для наблюдения. Конструкция def instances 857 за изменениями значений слотов экземпляров необходимо использовать отслеживаемый элемент slots. Применение отслеживаемого элемента instances иллюстрируется в следующем примере диалогового выполнения команд CLIPS> (watch instances)J CLIPS> (make-instance Jill of
PERSON)J > instance [Jill] of PERSON [Jill] CLIPS> (send [Jill] put- age 22) 1 22 CLIPS> (send [Jill] delete)J < — instance [Jill] of
PERSON TRUE CLIPS> (unwatch instances)J Последовательность знаков < указывает, что экземпляр удаляется, а последовательность знаков > свидетельствует о том, что экземпляр создается. 11.5 Конструкция ref iII8taIlCe8
(definstances [active] []
*) В этом определении терм definition> имеет такую форму (пате пате *) Необязательное ключевое слово active в конструкции бей используется для указания на то, что сопоставление с шаблонами должно осуществляться по мере обработки информации о перекрытии слотов в процессе создания экземпляра. По умолчанию для экземпляров конструкции definstances сопоставление с шаблонами не происходит до тех пор, пока не будет обработана вся информация о перекрытии слотов. Пример применения конструкции def instances приведен ниже. Конструкцией,
эквивалентной def facts, но применяемой к экземплярам,
является конструкция definstances. После выдачи команды reset всем экземплярам передается сообщение delete, а затем создаются все экземпляры, обнаруженные в конструкциях def instances. Конструкция def instances имеет следующий общий формат
Глава 11. Классы, экземпляры и обработчики сообщений 858
(definstances people (Jack of PERSON (full-name "Jack Q. Public" )
(age 23)) (of PERSON (full-name "John Doe") (hair-color black))) В
языке CLIPS предусмотрено несколько команд для манипулирования конструкциями definstances. Для отображения текущего списка конструкций бей, сопровождаемых в системе CLIPS, используется команда listdefinstances. Команда ppdefinstances (сокращение от pretty print структурированный вывод конструкции def instances) служит для отображения текстового представления конструкции def instances. Команда undefinstances предназначена для удаления конструкций def instances. Функция getdefinstances-list возвращает многозначное значение, содержащее список конструкций def instances. Эти команды имеют следующий синтаксис (list-definstances []) (ppdefinstances
) (undefrule ) (get- definstances-list []) 11.6 Классы и наследование В
таком случае, если бы потребовалось представить дополнительную информацию, относящуюся к тому, кто является служащим компании или студентом университета,
пришлось бы предпринять определенные усилия. Один из возможных подходов мог бы предусматривать дополнение конструкции def template с именем person для включения другой необходимой информации (deftemplate person "Person deftemplate" (slot full-name) (slot age) Одно из преимуществ использования языка COOL состоит в том, что классы могут наследовать информацию от других классов, что позволяет обеспечить совместный доступ к информации. Рассмотрим,
какие действия пришлось бы предпринимать при наличии конструкции й, которая представляет информацию о людях (deftemplate person "Person deftemplate" (slot full-name)
(slot age) (slot еуе-color) (slot hair-color))
859 11.6. Классы и наследование еуе-color) hair-color) job- position) employer) salary) university) maj or) GPA)) (slot (slot (slot

(slot (slot (slot (slot (slot Но ко всем людям относились бы только четыре слота этой конструкции de f template: full — пате, age,
еуе-color и hair — color. С другой стороны, слоты j ob — position,
employer и salary относились бы только к служащим, а слоты university, major и GPA — только к студентам. По мере добавления информации о людях, занимающихся другой деятельностью, приходилось бы вводить все больше и больше слотов в конструкцию deftemplate с именем person, причем по большей части эти слоты оказались бы неприменимыми для всех людей. Еще один подход мог бы состоять в создании отдельных конструкций deftemplate для служащих и студентов,
как в следующем примере (deftemplate employee "Employee deftemplate" (slot full-name) (slot age) (slot еуе-color) (slot hair- color) (slot job-position) (slot employer) (slot salary)) (deftemplate student "Student deftemplate" (slot full-name) (slot age) (slot еуе- color) (slot hair-color) (slot university) (slot major) (slot GPA)) При использовании такого подхода ка;кдая конструкция de f template содержит только необходимую информацию, но приходится дублировать некоторые из слотов. Если бы пришлось модифицировать атрибуты одного из таких дублирующихся слотов, то потребовалось бы вносить изменения во многих местах, чтобы обеспечить единообразие представления информации. Кроме того, если бы нужно было написать правило, позволяющее отыскивать всех людей с синими глазами Глава 11. Классы, экземпляры и обработчики сообщений то пришлось бы использовать два шаблона вместо одного (а если потребовалось бы также включить факты person, количество шаблонов стало бы равным трем, как показано ниже. (defrule find-blue-eyes (or (employee (пате ?name) (еуе-color blue))
(student (пате ?name) (еуе-color blue))) — > (printout t ?full- name "has blue eyes." crlf)) Классы позволяют совместно использовать общую информацию, принадлежащую к различным категориям, без дублирования, или включения
ненужной информации. Вернемся к первоначально рассматриваемому определению конструкции de f class с именем PERSON: (defclass PERSON "Person defclass" (а) (slot full-name) (slot age) (slot еуе-color) (slot Чтобы определить новые классы, которые расширяют определение класса PERSON, достаточно указать имя класса в атрибуте а нового класса, как показано ниже EMPLOYEE "Employee defclass" (is à PERSON) (slot job- position) (slot employer) (slot salary)) (defclass STUDENT "Student defclass" (а PERSON) (slot university) (slot major) (slot Атрибуты класса PERSON наследуются ив классе ив классе STUDENT. Примеры создания экземпляров для каждого из этих трех классов иллюстрирует следующий диалог (make-instance [John] of PERSON)J [John] CLIPS> (make- instance [Jack] of EMPLOYEE)D
861 11.6. Классы и наследование [ Jack] CLIPS> (make-instance
[Jill] [Jill] CLIPS> (send [John] print)J [John] of PERSON (пате nil) (age nil) (еуе-color nil) (hair-color nil) CLIPS> (send [Jack] print)J
[Jack] of EMPLOYEE (пате nil) (age nil) (еуе-со1ох nil) (hair- color nil) (job-position nil) (employer nil) (salary nil) CLIPS> (send
[Jill] print)J [Jill] of STUDENT (пате nil) (age nil) (eye — color nil)
(hair-color nil) (university nil) (major nil) (GPA nil) CLIPS> of
STUDENT)J Обратите внимание на то, что каждый экземпляр содержит только слоты, относящиеся к его классу. Как показано в следующем подразделе, в любом классе можно переопределить любой слот, который был уже определен в любом из его суперклассов. Класс, который либо прямо, либо косвенно наследует свойство другого класса, называется подклассом того класса, от которого он наследует свойства.
Класс, от которого наследуются свойства, называется суперклассом наследующего класса. Классы PERSON,
EMPLOYEE и STUDENT представляют собой подклассы класса. Классы EMPLOYEE и STUDENT являются подклассами класса PERSON. Класс USER — суперкласс классов PERSON,

EMPLOYEE и STUDENT, а класс PERSON — суперкласс классов и STUDENT. Иерархией классов с единичным наследованием называется такая иерархия, в которой каждый класс имеет
Глава 11. Классы, экземпляры и обработчики сообщений только один суперкласс, связанный с ним прямыми отношениями наследования. Иерархией классов с множественным наследованием называется такая иерархия, в которой любой класс может иметь несколько суперклассов,
связанных с ним прямыми отношениями наследования. В языке поддерживается множественное наследование, но до разделав котором множественное наследование рассматривается более подробно, мы будет ограничиваться применением примеров единичного наследования. Ниже приведен пример класса, в котором используется множественное наследование (в нем рассматривается студент,
который имеет работу. (defclass WORKING-STUDENT "Working
Student defclass" (а STUDENT EMPLOYEE)) Разрешение конфликтов между определениями слотов По умолчанию, если какой-то слот переопределяется в подклассе, то атрибуты слота из нового определения используются исключительно в экземплярах этого класса. Например, предположим, что определены следующие классы (defclass А ах у) (slot z (default 4))) (defclass В (а Ах у (default 5)) (slot z (default б) В таком случае создание экземпляров классов Аи В приведет к получению следующих результатов CLIPS> (make-instance а of A)J а CLIPS> (make- instance Ь of B)J [bl CLIPS> (send а print)J а of Ах) (у nil) (z
4) CLIPS> (send [b] print)J
11.6. Классы и наследование 863 [b] of В (х nil) (у 5) (z б) Обратите внимание на то, что слоту х экземпляра b по умолчанию присвоено значение nil вместо 3. Это связано стем что при отсутствии заданного по умолчанию значения для слотах класса В полностью перекрывается заданное по умолчанию значение 3, присваиваемое слоту х в классе A. Чтобы обеспечить возможность наследовать атрибуты слота от суперклассов, можно воспользоваться атрибутом слота Если этому атрибуту присваивается значение ехс1цsive, которое применяется по умолчанию, то атрибуты для слота устанавливаются на основе наиболее конкретного класса,
определяющего этот слот. В иерархии единичного наследования как таковой рассматривается класс, имеющий наименьшее количество суперклассов. Если же атрибуту source присваивается значение composite, то атрибуты, которые не определены явно в наиболее конкретном классе, определяющем слот, берутся из следующего по порядку наиболее конкретного класса, в котором определяется данный атрибут. Например,
если описанные ранее конструкции de f class с именами A и В
будут объявлены следующим образом (defclass А ах у) (slot z (default 4))) (defclass В (а Ах у (default 5)) (slot z (default б) то после создания экземпляров классов A и В будут получены такие результаты CLIPS> (make-instance а of A)J а CLIPS> (make- instance Ь of B)J [b] CLIPS> (зепи а print)J а of Ах) (у nil) (z
4) CLIPS> (send Ь print)J
864 Глава 11. Классы, экземпляры и обработчики сообщений [b]
of В (х 3) (у 5) (z б) CLIPS> Теперь, после того как слот х класса
В объявлен с атрибутом source, которому присвоено значение composite, этот слот может наследовать заданный по умолчанию атрибут от класса Аи применяемое по умолчанию результирующее значение для слотах экземпляра b становится равным 3. Возможно также запретить наследование значения слота с использованием атрибута слота propagation. Если этому атрибуту присваивается значение inherit, которое является заданным по умолчанию, то данный слот наследуется подклассами. А если этому атрибуту присваивается значение
по-1пйегИ, то слот подклассами не наследуется. Например, если классы Аи В будет определены следующим образом (defclass А — ах по) (slot у) (defclass В
(is-а А) ($101 z) ) то после создания экземпляров классов A и В
будут получены такие результаты CLIPS> (make-instance а А) ! а CLIPS> (make-instance [b] of B)J [b] CLIPS> (send а а of A (Х nil) (у nil) CLIPS> (send [b] print)J Ь of В (у nil) (z nil)
CLIPS>
11.6. Классы и наследование 865 Экземпляр b класса В
наследует слоту из класса А, ноне наследует слот х из класса
А, поскольку атрибут propagation последнего имеет значение по- inherit. Абстрактные и конкретные классы В языке предусмотрена возможность определять классы, используемые только для наследования. Такие классы называются абстрактными классами. Создание экземпляров абстрактных классов невозможно. По умолчанию классы являются конкретными. Для указания на то, должен ли класс быть абстрактным (abstract) или конкретным (concrete), применяется атрибут класса role. Атрибут класса role должен быть указан после атрибута класса is — а, но перед любыми определениями слотов, например, как показано ниже. (defclass ANIMAL (is — а) (role abstract)) (defclass МАММА? (is — а ИЯТМА?) (role abstract)) (defclass CAT (а МАММАЬ) (role concrete)) (defclass
DOG (is — а МАММА?) (role concrete)) Настоятельная необходимость объявлять какой-либо класс как абстрактный не возникает, но при использовании такого подхода в соответствующих условиях Классы ANIMAL и являются абстрактными, а классы CAT и DOG— конкретными.
Атрибут role наследуется, поэтому, хотя и не требуется объявлять класс МАММАЬ как абстрактный, поскольку он наследует этот атрибут от класса ANIMAL, необходимо объявить классы САТ и DOG как конкретные, в связи стем, что в противном случае они будут рассматриваться как абстрактные.
Попытка создать экземпляр абстрактного класса приводит к
формированию сообщения об ошибке, как в следующем примере CLIPS> (make-instance [animal-1] of ANIMAL)J
[ХИЯМИОВЗ] Cannot create instances of abstract class ANIMAL.
CLIPS> (make-instance [cat-1] of CAT)J [cat-1] Глава 11. Классы, экземпляры и обработчики сообщений Команды, относящиеся к конструкции defclass Для манипулирования конструкциями defclass предусмотрено несколько команд. Команда list-defclasses используется для отображения текущего списка конструкций поддерживаемых системой CLIPS. Эта команда имеет следующий синтаксис ( list-de f classes [] Целесообразно ознакомиться с таким выводом этой функции (list-defclasses)J FLOAT INTEGER SYMBOL STRING
MULTIFIELD EXTERNAL-ADDRESS FACT-ADDRESS INSTANCE-
ADDRESS INSTANCE-NAME OBJECT PRIMITIVE NUMBER
LEXEME код становится более удобным для сопровождения и проще обеспечивает повторное использование. При этом достаточно лишь исключить для пользователя возможность создавать экземпляры с помощью какого-то класса, если класс не предназначен для этой цели. Но если данный класс уже используется таким образом, тов будущих реализациях станет невозможным его исключение, поскольку это приведет к нарушению работы существующего кода. В рассматриваемом примере ответ на вопрос о том, должны ли классы ANIMAL и быть абстрактными, не так уж однозначен. Если требуется создать картотеку с информацией о животных,
содержащихся в некотором зоопарке, то данные классы, по- видимому, должны быть абстрактными, поскольку в природе не существует животных (в данном случае речь идет о млекопитающих, которые соответствовали бы только этому определению и не относились бык какому-то более конкретному виду живых существ. Но если бы предпринималась попытка идентификации какого-то животного, то вполне могла бы возникнуть необходимость создавать экземпляры класса

ANIMAL или M396MAL, например, для включения в них информации о том, что мы смогли выяснить в отношении данного животного. Классы и наследование 867 ADDRESS INSTANCE USER
INITIAL-OBJECT PERSON EMPLOYEE STUDENT For а total of 20
defclasses. CLIPS> Как показывают эти результаты, в языке имеется целый ряд заранее определенных примитивных классов, в том числе ОВЮЕСТ, PRIMI Т IVE, NUMBER, LEXEME,
FLOAT, INTEGER, SYMBOL, STRING, MULTIFIELD, ADDRESS,
INSTANCE, EXTERNAL-ADDRESS, FACT-ADDRESS, INSTANCE-
ADDRESS H INSTANCE — NAME. Эти классы нельзя использовать для создания других классов. Примитивные классы в основном применяются в сочетании с универсальными функциями, которые рассматривались в главе 10. В
приведенном выше списке не указаны заранее определенные классы USER и INITIAL — OBJECT. Класс USER является основой для создания новых классов, а класс INITIAL —
OBJECT является подклассом класса USER и используется для создания экземпляра initial- object (см. раздел 11.7). Список дополняет созданные нами классы (PERSON, EMPLOYEE и. Иерархия заранее определенных классов показана на рис. 11.1. Для отображения отношений наследования между классом и его подклассами предназначена команда browse- classes. Она имеет следующий синтаксис (browse-classes
[]) Если в вызове команды browse — classes не задается имя класса, то отображаются отношения наследования для корневого класса ОВЮЕСТ. Например, после вызова следующей команды отображается информация, содержащаяся на рис. 11.1, наряду со сведениями о классе PERSON и его подклассах, которые используются в качестве примеров CLIPS>
(browse-classes)J ОВЮЕСТ PRIMITIVE NUMBER INTEGER
FLOAT LEXEME SYMBOL STRING MULTIFIELD

Глава 11. Классы, экземпляры и обработчики сообщений Рис. 11.1. Краткий обзор заранее определенных классов EXTERNAL-ADDRESS FACT — ADDRESS INSTANCE-
ADDRESS * INSTANCE INSTANCE-ADDRESS * INSTANCE-NAME
USER ?ИТТ?АТ-OBJECT PERSON EMPLOYEE STUDENT
CLIPS> Отступы применяются для указания на то, что некоторый класс является подклассом первого предшествующего ему класса, обозначенного меньшим отступом. Например, все классы NUMBER, LEXEME,
MULTIFIELD, ADDRESS и INSTANCE являются подклассами класса PRIMITIVE. Звездочка перед именем класса означает, что этот подкласс связан прямыми отношениями наследования. Сопоставление с шаблоном объекта 869 больше чем с одним классом. Например, подкласс INSTANCE — связан прямыми отношениями наследования с классами и INSTANCE. Если в команде browse — classes указано имя класса, то отображается только информация о наследовании, относящаяся к указанному классу и его подклассам CLIPS> (browse-classes PERSON)J PERSON
EMPLOYEE STUDENT CLIPS> Для отображения текстового представления конструкции de f class используется команда ppdefclass (сокращение от pretty print defclass структурированный вывод конструкции бе f class). А команда undefclass служит для удаления конструкции de f class. Эти команды имеют следующий синтаксис (ppde f class name>) (undefclass ) Удаление конструкции бей остается невозможным до тех пор, пока существуют экземпляры класса, определенные с ее помощью. Прежде чем появится возможность удалить класс, необходимо удалить все экземпляры, принадлежащие к этому классу, и все подклассы этого класса, например, как показано ниже. CLIPS> (undefclass
STUDENT)J [PRNTUTIL4] Unable to delete defclass STUDENT.
CLIPS> (send [Jill] delete)J TRUE CLIPS> (undefclass STUDENT)J
CLIPS> 11.7 Сопоставление с шаблоном обьекта (object

*) Шаблоны объектов предоставляют некоторые возможности, недоступные при использовании шаблонов конструкций deftemplate или шаблонов упорядоченных фактов. Во-первых, для согласования с экземплярами нескольких классов может использоваться единственный шаблон объекта. Во-вторых, изменения в значениях слотов, не заданных в шаблоне объекта, не приводят к повторной активизации правила, к которому принадлежит данный шаблон. В-третьих, изменения в значениях слотов, не заданные в шаблоне объекта в пределах условного элемента logical, не приводят к удалению логического обоснования,
предусмотренного связанным с ним правилом. Шаблон объекта имеет следующую общую форму Глава 11 ° Классы, экземпляры и обработчики сообщений В
этом определении терм имеет такой общий формата) а терм аналогичен ограничениям слота шаблона, которые использовались в шаблонах конструкции deftemplate. Назначение ключевых слова и name описано ниже. Вначале рассмотрим следующий простой пример сопоставления с шаблоном объекта CLIPS> (clear)J CLIPS>
(defclass 1D-POINT (а USER) (slot x) ) J CLIPS> (defrule
Example-1 (оЬес1 (х х) ) ) (printout t "Value of x slot is " х crlf))J
CLIPS> (make-instance р of 1D-POINT (х 3))J р CLIPS>
(agenda)J О Example-1: р For а total of 1 activation. CLIPS>
(run)J Value of x slot is 3 CLIPS> Прежде всего определен класс с единственным атрибутом х. Затем определена конструкция deйги1е с именем Example-1. Обратите внимание на то, что в этом правиле предусмотрено только согласование с учетом значения слотах и нет никакого упоминания о классе 1D
— POINT. При создании этого правила система автоматически определяет, что класс 1D-POINT способен к согласованию с этим шаблоном. А после создания экземпляра класса 1D — POINT должным образом активизируется правило

Example — 1 и вовремя прогона программы обеспечивается правильный вывод значения слотах данного экземпляра.
Рассмотрим, что произойдет, если будет определен еще один класс, содержащий слот х CLIPS> (defclass 2D-POINT
11.7. Сопоставление с шаблоном объекта 871 (ах у) CLIPS> (make-instance р of 2D-POINT (x 4) (у 2))J [p2]
CLIPS> (agenda)J CLIPS> CLIPS> (defrule Example-1 (оЪес ха activations.
CLIPS> (run)J Value of x slot is 4 Value of x slot is 3 Обратите внимание на то, что теперь правило Example — активизируется применительно и к экземплярами к экземплярам [p2 ), содержащим слоты х из разных классов.
Сопоставление с шаблоном объекта и наследование Для сопоставления с шаблонами объекта могут также применяться слоты, унаследованные от других классов, как показано ниже (clear)J CLIPS> (defclass 1D-POINT (а USER) (slot x) ) Возможно, такое развитие событий покажется неожиданным, но правило Example — 1 не активизируется экземпляром [p2]. Это связано стем, что определение возможности согласования класса с шаблоном объекта происходит вовремя обработки системой CLIPS объявления правила. Экземпляры классов,
определяемые после определения правила, не согласуются с шаблонами объекта, используемыми в правиле. А если правило — 1 будет переопределено, то обнаружится поведение,
на которое мы рассчитывали первоначально:
Глава 11. Классы, экземпляры и обработчики сообщений 872
CLIPS> (defclass 2D-POINT ау (а 2D-POINT) (slot z))J CLIPS> (defrule
Ехавр1е-2 (object (у ?y)) ;) (printout t "Value of y slot is " у crlf))J
CLIPS> (make-instance р of 1D-POINT (х 3))J р CLIPS> (make- instance р of 2D-POINT (х 1) (у 2)) 1 [рг] CLIPS> (make-instance
р of 3D-POINT (х 2) (у 4) (z 3)) 1 [рз] CLIPS> (agenda)J 0
Example-2: [рЗ] 0 Example-2: р For а total of 2 activations.
CLIPS> (run)J Value of y slot is 4 Value of y slot is 2 Ключевые слова аи Ключевое слово а при его использовании в качестве имени слота имеет специальное значение, если оно включено в шаблон объекта. Это ключевое слово ограничивает перечень экземпляров, согласующихся с шаблоном, экземплярами Обратите внимание на то, что правило Example — 2 активизируется под действием экземпляров р и [рЗ], ноне р. Экземпляр р является экземпляром класса 2D-POINT, в котором определен слоту, на который есть ссылка в этом правиле. Экземпляр [рЗ ] является элементом класса 3D — POINT, который наследует слоту от класса 2D — POINT. Экземпляр р ] класса 1D-POINT включает только слот х, поэтому не обеспечивает согласование с шаблоном объекта из правила Example — 2.
11.7. Сопоставление с шаблоном обьекта 873 тех классов,
которые удовлетворяют ограничению is — а, например, как показано ниже. CLIPS> (defrule Example-3 (object (ах х) ш (printout t "Value of x slot is " ?z crlf))J CLIPS> (agenda)J
0 Example-3: р) 0 Example-3: р For а total of 2 activations.
CLIPS> (хшъ) Value of x slot is 2 Value of x slot is 1 Обратите внимание на то, что правило Example-3 активизируют только экземпляры р и [p3], даже несмотря на то, что экземпляр [p1] также содержит атрибут слотах. Это связано стем, что экземпляр [p1] не является экземпляром класса 2D —
POINT или экземпляром класса, который наследует свои свойства от класса 2D — POINT. Но экземпляр удовлетворяет шаблону объекта, поскольку является элементом класса 2D — POINT в силу наследования. Тем не менее возможность согласования экземпляра р ] с шаблоном объекта можно исключить, явно запретив использование класса 3D —
POINT: CLIPS> (defrule example-4 (object ах р For а total of 1 activation. CLIPS>
(run)J Value of x slot is 1 CLIPS> Любой класс, на который имеется ссылка в шаблоне объекта, должен быть уже определен, в противном случае возникает ошибка CLIPS>
(defrule example-5 (оЬес (ах х Глава 11. Классы, экземпляры и обработчики сообщений t "Value of z slot is " ?z crlf))J [OBJRTBLD5] Undefined class in object pattern. ERROR: (defrule MAIN::example-5 (а 4D-POINT) CLIPS> Тоже утверждение справедливо по отношению к слотам, на которые имеется ссылка в шаблоне объекта. В программе должен быть представлен по меньшей мере один класс, который содержит все атрибуты слотов,
упомянутые в шаблоне объекта, так как в противном случае возникает ошибка CLIPS> (defrule б (object (w ?w))
(printout t "Value of w slot is " ?w crlf))J [OBJRTBLD2] No objects of existing classes can satisfy w restriction in object pattern. ERROR:
(defrule б (object (w CLIPS> В данном случае нив одном из существующих классов (1D — POINT, 2 D— - POINT и — POINT) нет атрибута слота w, поэтому шаблон объекта в правиле Example — б не может быть удовлетворен, и вырабатывается сообщение об ошибке. Для согласования с конкретными экземплярами может применяться ключевое слово пате, например, следующим образом CLIPS> (defrule ezample-7
(object (name [p1] I [рЗ]) (х х) ;> (printout t "Value of z slot is " ?z crlf))J CLIPS> (agenda)J 0 example-7: [p3] 0 example-7: р For а total of 2 activations. CLIPS> (run)J Value of x slot is 2 Value of x slot is 3 CLIPS>
11.7. Сопоставление с шаблоном объекта 875 В правиле — 7 используется ключевое слово пате для ограничения перечня экземпляров, которые могут быть согласованы с шаблоном объекта, экземплярами р и [рЗ].
Экземпляр р, который содержит значение слотах, не будет
согласован с шаблоном, поскольку его имя не соответствует ограничению пате. Ключевые слова is — аи пате имеют особый смысл в шаблонах объектов, поэтому не могут применяться в качестве имен слотов в определении конструкции de f clas Активизация шаблонов обьектов Одним очень важным различием между шаблонами объектов и шаблонами фактов является то, что при изменении значения слота экземпляра соответствующее влияние испытывают только те шаблоны объектов, которые явно согласуются с одним из слотов. Для иллюстрации сказанного еще раз рассмотрим первый вариант правила sum — rectangles, приведенный в разделе 8.10: (defrule sum-rectangles (rectangle (height ?height) (width ?width)) ?sum <-

1   ...   60   61   62   63   64   65   66   67   ...   74


написать администратору сайта