(deffunction change-which-bit (?x)
(bind?i 1)
(while (and (evenp?x) (!=?x 0)) do
(bind?x (div?x 2))
(bind?i (+?i 1))
)
?i
)
Кроме того, поскольку фактическое определение функции, производящей связь логических элементов в схему, осуществляется в отдельном файле, необходимо предварительное объявление этой функции.
Пример 14.11. Предварительное объявление функции connect-circuit
(deffunction connect-circuit ())
Реализация правил экспертной системы
После добавления в CLIPS всех перечисленных определений и конструкций, можно приступить к созданию правил, реализующих работу алгоритма, описанного в разд. 14.2.
Начнем с реализации правила, инициализирующего только что загруженную логическую схему.
Пример 14.12. Правило startup
(defrule startup
=>
(connect-circuit)
(bind?*sources* (find-all-instances ((?x SOURCE)) TRUE))
(do-for-all-instances ((?x SOURCE)) TRUE
(bind?*gray-code* (create$?*gray-code* 0)))
(bind?*max-iterations* (round (** 2 (length?*sources*))))
(assert (current-iteration 0))
)
Правило startup не имеет явных условных элементов, поэтому, как было описано в гл. 6, правило будет активизировано первым фактом initial-fact. Сразу после запуска правила вызывается функция connect-circuit, инициализирующая текущую логическую схему. После этого правило получает имена всех элементов источников в переменную sources. Затем правило startup создает нулевой код Грея для начала процесса перебора всех вариантов входных сигналов, вычисляет максимальное количество итераций и добавляет факт с номером текущей итерации.
|
|
Теперь необходимо запустить итерационный процесс перебора комбинаций входных сигналов. Для этого служит правило compute-response-1st-time.
Пример 14.13. Правило compute-response-1st-time
(defrule compute-response-1st-time
?f <- (current-iteration 0)
=>
(do-for-all-instances ((?source SOURCE)) TRUE
(send?source put-output-1 0))
(assert (result?*gray-code* =(str-implode (LED-response))))
(retract?f)
(assert (current-iteration 1)
)
Это правило предназначено для первого шага перебора всевозможных входных сигналов. Оно передает нулевой сигнал всем источникам логической схемы, что вызывает автоматическое вычисление результата. Далее полученный результат сохраняется в факте вида:
(result текущее-состояние-источников текущее-состояние-индикаторов)
После этого правило удаляет факт (current-iteration 0), который и запускает правило и добавляет факт (current-iteration 1).