Пример 14.10. Функция change-which-bit

(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).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: