А.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)
Если за префиксами ? и $? не следует имя переменной, они рассматриваются как универсальные символы подстановки, которым соответственно может быть сопоставлен любой элемент или сегмент списка.