Пример 14.2. Классы логических элементов source и led
(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 чрезвычайно компактно, однако, благодаря использованию продуманной иерархии классов и множественного наследования, класс обладает всей необходимой функциональностью. Классы остальных логических элементов реализуем аналогично. Пример 14.5. Классы остальных логических элементов (defclass AND-GATE (is-a TWO-INPUT ONE-OUTPUT COMPONENT) (role concrete) ) (deffunction andt (?x?y) (if (and (!=?x 0) (!=?y 0)) then 1 else 0)) (defmessage-handler AND-GATE compute-output () (if (and (integerp?self: input-1) (integerp?self: input-2)) then (send?self put-output-1 (and#?self: input-1?self: input-2)) ) (defclass OR- GATE (is-a TWO- INPUT ONE-OUTPUT COMPONENT) (role concrete) ) (deffunction or# (?x?y) (if (or (!=?x 0) (!-?y 0)) then 1 else 0)) (defmessage-handler OR-GATE compute-output () (if (and (integerp?self: input- 1) (integerp?self: input-2)) then (send?self put-output-1 (or#?self:input-l?self: input-2))) ) (defclass NAND-GATE (is-a TWO- INPUT ONE-OUTPUT COMPONENT) (role concrete) ) (deffunction nand# (?x?y) (if (not (and (!=?x 0) (!=?y 0))) then 1 else 0)) (defmessage-handler NAND-GATE compute-output () (if (and (integerp?self: input-1) (integerp?self: input-2)) then (send?self put-output-1 (nand#?self: input-1?self: input-2))) ) (defclass XOR-GATE (is-a TWO-INPUT ONE-OUTPUT COMPONENT) (role concrete) ) (deffunction xor# (?x?y) (if (or (and (=?x 1) (=?y 0)) (and (=?x 0) (=?y 1))) then 1 else 0)) (defmessage-handler XOR-GATE compute-output () (if (and (integerp?self: input-1) (integerp?self: input-2)) then (send?self put-output-1 (xor#?self:input-l?self: input-2))) ) (defclass SPLITTER (is-a ONE-INPUT TWO-OUTPUT COMPONENT) (role concrete) ) (defmessage-handler SPLITTER compute-output () (if (integerp?self: input-1) then (send?self put-output-1?self:input-1) (send?self put-output-2?self:input-1)) ) На этом разработку классов, необходимых для представления логических элементов, можно считать завершенной. Связь логических элементов После создания набора классов, необходимого для представления всех используемых логических элементов, встает вопрос объединения этих элементов в логическую схему. Для ввода в систему набора элементов, необходимых для создания заданной логической схемы, будем использовать отдельный файл с конструктором definstances. Ниже приведен пример такого конструктора для схемы, изображенной на рис. 14.2.
|