А.2.2. Правила

В языке CLIPS правила имеют следующий формат:

(defrule <имя правила>

< необязательный комментарий >

< необязательное объявление >

< предпосылка_1 >

< предпосылка_т > =>

< действие_1 >

< предпосылка_п > )

Например:

(defrule chores

"Things to do on Sunday"

(salience 10)

(today is Sunday)

(weather is warm) =>

(assert (wash car))

(assert (chop wood) )

В этом примере Chores — произвольно выбранное имя правила. Предпосылки в условной части правила

(today is Sunday) (weather is warm)

сопоставляются затем интерпретатором с базой фактов, а действия, перечисленные в выполняемой части правила (она начинается после пары символов =>), вставят в базу два факта

(wash car) (chop wood)

в случае, если правило будет активизировано. Приведенный в тексте правила комментарий

"Things to do on Sunday"

"Что сделать в воскресенье"

поможет в дальнейшем вспомнить, чего ради это правило включено в программу. Выражение

(salience 10)

указывает на степень важности правила. Пусть, например, в программе имеется другое правило

(defrule fun

"Better things to do on Sunday"

(salience 100)

(today is Sunday)

(weather is warm) =>

(assert (drink beer))

(assert (play guitar)) )

Поскольку предпосылки обоих правил одинаковы, то при выполнении оговоренных условий они будут "конкурировать" за внимание интерпретатора. Предпочтение будет отдано правилу, у которого параметр salience имеет более высокое значение, в данном случае — правилу fun. Параметру salience может быть присвоено любое целочисленное значение в диапазоне [-10 000, 10 000]. Если параметр salience в определении правила опущен, ему по умолчанию присваивается значение 0.

Обычно в определении правила присутствуют и переменные. Если, например, правило

(defrule pick-a-chore

"Allocating chores to days"

(today is ?day)

(chore is ?job) =>

(assert (do ?job on ?day)) )

будет сопоставлено с фактами

(today is Sunday) (chore is carwash)

то в случае активизации оно включит в базу новый факт

(do carwash on Sunday).

Аналогично, правило

(defrule drop-a-chore

"Allocating chores to days"

(today is ?day)

?chore <- (do ?job on ?day) =>

(retract ?chore) )

отменит выполнение работ по дому (a chore). Обратите внимание на то, что оба экземпляра переменной ?day должны получить одно и то же значение. Переменная ?chore в результате сопоставления должна получить ссылку на факт, который мы собираемся исключить из базы. Таким образом, если это правило будет сопоставлено с базой фактов, в которой содержатся

(today is Sunday)

(do carwash on Sunday)

то при активизации правила из базы будет удален факт

(do carwash on Sunday)

С подробностями выполнения процесса сопоставления в интерпретаторе CLIPS вы сможете познакомиться в Руководстве пользователя, а здесь только отметим, что факт

(do carwash on Sunday)

будет сопоставлен с любым из представленных ниже образцов

(do ? ? Sunday)

(do ? on ?)

(do ? on ?when)

(do $?)

(do $? Sunday)

(do ?chore $?when)

Учтите, что префикс $? является признаком сегментной переменной, которая будет связана с сегментом списка. Например, в приведенном выше примере переменная $?when будет связана с

(on Sunday)

Если за префиксами ? и $? не следует имя переменной, они рассматриваются как универсальные символы подстановки, которым соответственно может быть сопоставлен любой элемент или сегмент списка.