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

дб. Четвертое издание джозеф Джарратано Университет Хьюстон клиэрЛэйк Гари Райли 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
страница65 из 74
1   ...   61   62   63   64   65   66   67   68   ...   74

(sum ?total) — ) (retract ?sum) (assert (sum (+ ?total (* ?height ?
width))))) Формулировка этого правила содержит ошибку,
связанную стем, что любая попытка модифицировать факт sum повторно активизирует правило под действием уже обработанного факта rectangle, что приводит к возникновению бесконечного цикла. Этот недостаток не удается устранить путем преобразования факта sum из упорядоченного факта в факт, заданный с помощью конструкции deftemplate, и использования команды modify. В решении этой проблемы,
предложенном в разделе 8.4, для вычисления суммы применяется несколько правил. Но лучшее решение состоит в использовании шаблонов объектов соответствующим образом.
Ниже приведен результат первой попытки переформулировать правило sum — rectangles из разделав целях применения объектов. (defclass RECTANGLE (is — а USER) (slot height) (slot width)) (defclass SUM (а USER) (slot total)) (definstances initial- information (of RECTANGLE (height 10) (width б Глава 11. Классы, экземпляры и обработчики сообщений оба RECTANGLE) (height ?height)
(width ?width)) ?sum <- (object (а SUM) (total ?total)) > (send ?
sum put-total (+ ?total (* ?height ?width)))) В этом новом правиле sum — rectangles заслуживает внимания несколько особенностей. Прежде всего, как и при использовании шаблонов фактов, можно связать с переменной экземпляр, согласующийся с шаблоном, применяя оператор связывания с шаблоном < —. В
данном случае с переменной ?sum связывается адрес экземпляра, согласующегося с шаблоном объекта SUM. Затем эта переменная может использоваться в качестве параметра в функции send для передачи сообщений экземплярам. Нов ходе прогона программы этот код демонстрирует возникновение той же проблемы, которая наблюдалась при использовании шаблонов фактов, — бесконечный цикл. Это связано стем, что изменение значения слота total из правой части правила с помощью сообщения put — total приводит к повторной активизации шаблона объекта SUM, поскольку этот шаблон согласуется со слотом total. Но согласовывать слот total в левой части правила не требуется, поскольку ссылка на значение,
связанное с переменной ?total, больше не применяется в каком- либо из шаблонов в левой части. Попытка составить правило, в котором выборка значения осуществляется путем передачи сообщения в правой части правила, приводит к получению следующего правила (defrule sum-rectangles (object (а) (height ?height) (width ?width)) ?sum <- (object (а) — > (bind ?total (send ?sum get — total)) (send ?sum put- total (+ ?total (* ?height ?width)))) Эта версия правила, в отличие от первоначальной версии, не приводит к возникновению бесконечного цикла. А если бы было известно, что в системе будет всегда присутствовать только один экземпляр класса, то можно было бы. Сопоставление с шаблоном объекта 877 пройти еще на шаг дальше по пути упрощения данного правила, как показано ниже. (defrule sum-rectangles (object (is — а RECTANGLE) (height
?height) (width ?width)) — > (bind ?total (send [sum] get-total))
(send [sum] put-total (+ ?total (* ?height ?width)))) Дело в том, что
можно просто сослаться на экземпляр по имени в правой части правила, а не применять сопоставление с шаблонами для выборки адреса экземпляра [sum] и присваивания переменной. Атрибут сопоставления с шаблонами (defclass SUM (а) (slot total (pattern-match non-reactive))) (defrule sum- rectangles (object (а RECTANGLE) (height ?height) (width ?
width)) ?sum <- (object (а SUM) (total ?total)) — > (send ?sum put-total (+ ?total (* ?height ?width)))) то при обработке в системе определения правила sum — rectangles возникло бы такое сообщение об ошибке [OBJRTBLD2] No objects of existing classes can satisfy total restriction in object pattern. По существу,
возможность провести сопоставление с этим шаблоном отсутствует, поскольку условие is — а во втором шаблоне ограничивает перечень воз- Атрибут pattern-match позволяет указать, что либо слот, либо класс не может участвовать в сопоставлении с шаблонами. Если этому атрибуту присваивается значение reactive, которое предусмотрено по умолчанию, то указанный слот или класс обладает способностью активизировать сопоставление с шаблонами в левой части правила. Если же этому атрибуту присваивается значение non-reactive, то указанный слот или класс не активизирует сопоставление с шаблонами в левой части правила. Например, если бы класс SUM был переопределен в целях использования атрибута pattern — match и применялась первоначальная версия правила sum — rectangles следующим образом:
Глава 11. Классы, экземпляры и обработчики сообщений 878
можных классов классом SUM, а этот класс не имеет слота доступного для сопоставления с шаблонами, поэтому при обработке данного правила вырабатывается ошибка. В
программе может быть предусмотрено применение нескольких классов со слотами, имеющими одно и тоже имя, причем часть из них может иметь атрибута часть — non — При обработке объявления правила система определяет, какие
классы в принципе могут с ним согласовываться, и из рассмотрения исключаются классы, имеющие слоты с атрибутами non — reactive, на которые имеется ссылка в соответствующем шаблоне. Атрибут pattern — match можно также использовать на уровне класса, например, как показано ниже. (defclass SUM (а USER) (pattern-match non-reactive) (slot total)) Шаблоны обьектов и условный элемент lagical Шаблоны объектов и средства создания экземпляров могут использоваться с условным элементом logical, также, как могут использоваться факты и шаблоны фактов. Но если на слот нет ссылки в шаблоне объекта в пределах условного элемента logical, то изменения в слотах экземпляра не влияют на логическое обоснование для факта или экземпляра. Например,
рассмотрим следующие конструкции, созданные с использованием шаблонов конструкций de f template:
(deftemplate emergency (slot type) (slot location)) (deftemplate response-team (slot name) (slot location)) (defrule create-response- team (logical (emergency (location ?location))) Атрибут класса pattern-match должен быть задан после атрибутов класса is — аи, но до каких-либо определений слотов. Если класс объявлен с атрибутом non — reactive, то экземпляры этого класса не будут согласовываться с какими-либо шаблонами
(независимо оттого, какими являются значения атрибутов pattern — match отдельных слотов, но экземпляры подклассов этого класса могут согласовываться с шаблонами, если атрибут класса pattern — match переопределен в них как reactive. Кроме того, атрибут класса pattern-match не влияет явно на атрибуты слотов pattern-match, поэтому класс может наследовать слоты с атрибутом reactive от класса с атрибутом non — reactive.
11.7. Сопоставление с шаблоном объекта 879 — > (assert
(response-team (name first-response) (location ?location)))) Если после загрузки этих конструкций в программу и внесения факта emergency в список фактов начнется прогон программы, то правило create — response-team создаст факт response — team
следующим образом CLIPS> (reset)J CLIPS> (watch facts)J
CLIPS> (аввег1. (emergency (type unknown) (location building-1))J
> f-1 (emergency (type unknown) (location building-1))
CLIPS> (run)J — > f-2 (response-team (name first-response)
(location building-1)) CLIPS> Модификация факта emergency вызывает извлечение факта response— team, даже несмотря на то, что в правиле create — response — team не происходит доступ к слоту type: CLIPS> (modify 1 (type fire))J < f-1 (emergency
(type unknown) (location building-1)) (response-team (name first- response) (location building-1)) (emergency (type fire) (location building-1)) > f-3 CLIPS> Для воссоздания факта response-team необходимо снова запустить правило create- response-team: CLIPS> (run)J > f-4 (response-team (name first- response) (location building-1)) CLIPS> Ниже приведена та же программа, в которой используются конструкции бей class и объекты. Обратите внимание на то, что в этом варианте удален слот name, применяемый в конструкции de f template с именем response — Глава 11. Классы, экземпляры и обработчики сообщений 880
(defclass EMERGENCY (is — а USER) (slot type) (slot location))
(defclass RESPONSE-TEAM (is — а USER) (slot location)) (defrule create-response-team (logical (object (а EMERGENCY) (location
?location))) (make-instance first-response of RESPONSE-TEAM
(location ?location))) Проводя работу с этими новыми конструкциями, можно убедиться в том, что их первоначальное поведение аналогично тому, которое возникает при использовании фактов CLIPS> (reset)J CLIPS> (watch instances)J CLIPS> (make-instance ее ее е of EMERGENCY (type unknown)
(location building-1) CLIPS> (run)J > instance [first-response] of
RESPONSE-TEAM CLIPS> В результате прогона программы экземпляр [ first — response] создается после экземпляра [ е ] Эти экземпляры аналогичны конструкциям de f template с
именами emergency и response — team, создаваемыми в примере факта. Но замена типа экземпляра [ е ] с именем unknown типом fire не вызывает удаление и создание другого экземпляра [ f irst — response], как показано ниже. поскольку он имеет особый смысл в шаблонах объектов. Просто в данном случае экземпляру RESPONSE — TEAM присваивается имя,
которое должно быть помещено в слот пате конструкции de f template с именем response — team.
11.7. Сопоставление с шаблоном объекта 881 CLIPS> (send ее е of EMERGENCY
(type fire) (location building-1) CLIPS> Шаблон initial-object Как было описано в разделах 7.11 ив некоторых обстоятельствах система CLIPS вводит в левую часть правила шаблон initial — йас

. Но при определенных условиях, если в каком-то правиле используется шаблон объекта, система вместо шаблона initial — f act применяет шаблон initial — Объектными эквивалентами конструкции deftemplate с именем initial— fact и конструкции def facts с именем initial — fact (см.
раздел 7.10) являются конструкции defclass с именем INITIAL —
OBJECT и конструкции def instances с именем initial — object:
(defclass INITIAL-OBJECT (is — а USER)) (definstances initial- object (initial-object of П4?Т?А? -OBJECT)) Если в некоторой позиции вправило необходимо ввести шаблон initial— Йас и
(или) initial — object, тов случае, если шаблоном,
предшествующим позиции вставки, является шаблон факта,
добавляется шаблон initial — fact, в противном случае, если шаблоном, предшествующим точке вставки, являет- Безусловно,
в данном случае экземпляр [f irst — response] не удаляется, а для его воссоздания снова выполняется правило create —
response — team, поэтому в этом примере применение экземпляров и шаблонов объектов оказывается более эффективным, чем фактов и шаблонов фактов. Слот location явно согласуется с правилом create — response — team шаблона объекта, поэтому при изменении значения этого слота
возникает поведение, аналогичное наблюдаемому при использовании фактов, как в следующем примере CLIPS> (е put-location building-2)J < instance [first-response] of
RESPONSE-TEAM building-2 CLIPS> (run)J --> instance [first- response] of RESPONSE-TEAM Глава 11. Классы, экземпляры и обработчики сообщений 882
(object (is à INITIAL OBJECT) (name [initial-object])) С учетом того,
что для добавления шаблона используются эти новые правила,
следующую конструкцию de f rule: (defrule по (not
(object (а EMERGENCY))) => (printout t "No emergencies" можно преобразовать в такую конструкцию (defrule по- emergencies (object (а INITIAL-OBJECT) (name [initial-object]))
(not (object (а EMERGENCY))) — > (printout t "No emergencies"
crlf)) поскольку отсутствует шаблон, предшествующий условному элементу not, а шаблон, следующий за условным элементом является шаблоном объекта. 11.8 Обработчики сообщений,
определяемые пользователем Как уже было сказано, согласно определению языка COOL, к объявлению каждого класса автоматически добавляются создаваемые системой обработчики сообщений print, delete, put — и get —. Но пользователь имеет также возможность определить собственные обработчики сообщений. Для этой цели используется конструкция defmessage-handler, которая имеет следующий общий синтаксис (defmessage-handler
[
1   ...   61   62   63   64   65   66   67   68   ...   74


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