close

Вход

Забыли?

вход по аккаунту

?

Clips2

код для вставкиСкачать
Лаб. №4. Объектно-ориентированные средства в CLIPS.
Использование ОО средств в CLIPS позволяет значительно упростить программирование правил, поскольку для обновления данных можно применять механизм передачи и обработки сообщений методами классов.
Примерный шаблон объявления класса ("автомат газводы"):
(defclass gas-water-automate
(is-a USER)
(role concrete)
(pattern-match reactive)
(slot gas-water (type INTEGER) (create-accessor read-write))
(slot syrup (type INTEGER) (create-accessor read-write))
)
Первые три слота этого класса - системные:
* automate - это пользовательский класс
* automate - конкретный класс, т.е. возможно создание экземпляров этого класса (в отличие от абстрактного класса)
* экземпляры класса automate могут быть использованы в качестве объектов данных, которые можно сопоставлять с условиями в правилах и использовать в действиях, определенных правилами.
едующие два слота представляют свойства класса:
* слот gas-water указывает на количество воды (в стаканах), оставшееся в автомате
* слот syrup указывает на количество сиропа (на один стакан), оставшееся в автомате
Для того чтобы иметь возможность записывать в слот новое значения и считывать текущее, нужно разрешить формирование соответствующих функций доступа с помощью конструкции (create-accessor read-write).
Теперь сформируем экземпляр класса gas-water-automate:
(definstances automates
(our-automate of gas-water-automate
(gas-water 1)
(syrup 2)
)
)
Т.е. в "нашем" автомате (объект our-automate) сейчас воды ровно на 2 стакана, а сиропа - на 3 стакана.
Изменение значений свойств объектов по правилам ООП производится самими объектами, поэтому в языке CLIPS это реализовано посредством обработчиков сообщений.
Создадим обработчик сообщения, который по номиналу опущенной в автомат монеты будет наливать воды без сиропа (1 копейка) и воду с сиропом (3 копейки); если же в автомат опущена какая-либо другая монета, то выдавать предупредительное сообщение. Также предусмотрим случай, что могут закончиться как сиром, так и вода.
(defmessage-handler gas-water-automate getwater (?money)
(if (eq ?money 1)
then (if (> (dynamic-get gas-water) 0)
then (dynamic-put gas-water (- (dynamic-get gas-water) 1))
(printout t crlf "Your gas-water, please" t crlf)
else (printout t crlf "Sorry, no more gas-water" t crlf)
)
else (if (eq ?money 3)
then (if (and (> (dynamic-get gas-water) 0) (> (dynamic-get syrup) 0))
then (dynamic-put gas-water (- (dynamic-get gas-water) 1))
(dynamic-put syrup (- (dynamic-get syrup) 1))
(printout t crlf "Your gas-water with syrup, please" t crlf)
else (printout t crlf "Sorry, no more gas-water or syrup" t crlf)
)
else (printout t crlf "Wrong money" t crlf)
)
)
)
Теперь определим правило, которое будет "говорить" автомату дать воды, сообщая ему номинал монеты:
(defrule getwater
(money ?money)
=>
(send [our-automate] getwater ?money)
)
Теперь наберем команду (reset), зададим факт, что у нас монета в 2 копейки:
(assert (money 3))
и запустим программу командой (run).
А теперь повторим процедуру, имея монету в 1 копейку:
(reset)
(assert (money 1))
(run)
Документ
Категория
Без категории
Просмотров
17
Размер файла
10 Кб
Теги
clips
1/--страниц
Пожаловаться на содержимое документа