(defclass SOURCE
(is-a NO-INPUT ONE-OUTPUT COMPONENT)
(role concrete)
(slot output-1 (default UNDEFINED)
(create-accessor write))
)
(defclass LED
(is-a ONE-INPUT NO-OUTPUT COMPONENT)
(role concrete)
)
Класс source реализует поведение источника. Этот логический элемент имеет один выход и не имеет входов. Класс led является реализацией логического индикатора. Он имеет один вход и не имеет выходов. В дальнейшем при создании экспертной системы многократно придется решать проблему сбора результата обработки входных сигналов со всех индикаторов логической схемы. Для решения этой задачи предназначена следующая функция:
Пример 14.3. Функция LED-response
(deffunction LED-response ()
(bind?response (create$))
(do-for-all-instances ((?ledLED)) TRUE
(bind?response (create$?response
(send?led get-input-1))))
?response
)
Эта функция собирает составное поле из значений, хранящихся во всех объектах класса led текущей логической схемы, с помощью функции do-for-all-instances.
Приступим к реализации более сложных логических элементов. Их реализация будет напоминать классы source и led, за исключением того, что остальные логические элементы должны переопределять обработчик compute-output, который будет производить обработку сигнала, полученного на входе элемента.
|
|
Пример 14.4. Класс not-gate
(defclass NOT-GATE
(is-a ONE-INPUT ONE-OUTPUT COMPONENT)
(role concrete)
)
(deffunction not # (?x) (- 1?x))
(defmessage-handler NOT-GATE compute-output ()
(if (integerp?self: input-1) then
(send?self put-output-1 (not #?self: input-1)))
)
Обратите внимание, что в реализации обработчика compute-output используется функция not#, которая и выполняет необходимые вычисления. Определение класса not-gate чрезвычайно компактно, однако, благодаря использованию продуманной иерархии классов и множественного наследования, класс обладает всей необходимой функциональностью. Классы остальных логических элементов реализуем аналогично.