
- •Министерство образования и науки Российской Федерации
- •Данные и знания. Основные определения.
- •Особенности знаний. Переход от Базы Данных к Базе Знаний.
- •Контрольные вопросы
- •Модели представления знаний
- •Связи типа «часть—целое» («класс—подкласс», «элемент—множество»,...);
- •Контрольные вопросы
- •Классификация экспертных систем
- •Коллектив разработчиков
- •Технология проектирования и разработки эс
- •Технология быстрого прототипирования
- •Контрольные вопросы
- •Основные теоретические сведения
- •Операции над фактами
- •Работа с базой правил. Правила
- •Функции для манипулирования данными. Определение функций
- •Gui-интерфейс clips
- •Контрольные вопросы
- •2. Автоматизация доказательства в логике предикатов
- •Метод резолюций в исчислении высказываний
- •Правило унификации в логике предикатов
- •Метод резолюций в исчислении предикатов
- •Применение языка clips
- •Применение нечёткой логики в экспертных системах
- •Контрольные вопросы
- •Литература Основная литература
- •Рыбина, г.В. Основы построения интеллектуальных систем: учебное пособие. / г.В. Рыбина. — м.: инфра-м, 2010. — 431 с. — Режим доступа:
- •Дополнительная литература
- •Периодическая литература
- •Интернет-ресурсы
Операции над фактами
Факты можно добавлять к списку фактов (assert), удалять из списка фактов (retract), изменять (modify), дублировать (duplicate).
Рассмотрим работу с базой фактов в CLIPS на практике. Сразу после запуска CLIPS-приложения (clipswin.exe) на выполнение на экране появится сообщение, извещающее пользователя, что он работает с интерпретатором.
CLIPS>
В режиме интерпретатора пользователь может использовать множество команд, так можно включить в базу фактов прямо из командной строки с помощью assert, например:
CLIPS> (assert (today is Sunday))
<Fact-0>
CLIPS> (assert (weather is warm))
<Fact-l>
Для вывода списка фактов, имеющихся в базе, используется команда facts:
CLIPS> (facts)
f-0 (today is Sunday)
f-1 (weather is warm)
Для удаления фактов из базы используется команда retract:
CLIPS> (retract 1)
CLIPS> (facts)
f-0 (today is Sunday)
Эти же команды, assertиretract, используются в выполняемой части правила (заключении правила) и с их помощью выполняется программное изменение базы фактов.
Часто приходится пользоваться и другой командой интерпретатора, clear, которая очищает базу фактов (как правило, эта команда доступна в одном из выпадающих меню).
CLIPS> (clear)
CLIPS> (facts)
Массив фактов можно удалить из базы командой undeffacts. Например, если в программе был введен массив фактов с именем today:
(deffacts today
(today is Sunday)
(weather is warm))
который необходимо удалить, то в командной строке необходимо ввести следующую команду:
CLIPS> (undeffacts today)
Выражение deffactsможно вводить и в командную строку интерпретатора, нолучше записать его в текстовый файл с помощью редактора CLIPS или любого другого текстового редактора(файлы имеют расширение .clp). Загрузить этот файл в дальнейшем можно с помощью команды в меню File, либо из командной строки.
CL1PS> (load "my file")
Однако после загрузки файла факты не передаются сразу же в базу фактов CLIPS. Команда deffacts просто указывает интерпретатору, что существует массив today, который содержит множество фактов. Собственно загрузка выполняется командой reset.
CLIPS> (reset)
Команда resetсначала очищает базу фактов, а затем включает в нее факты из всех ранее загруженных массивов. Она также добавляет в базу единственный определенный системой факт:
f-0 (initial-fact)
Это делается по умолчанию, поскольку иногда имеет смысл включить в программу правило startrule, которое может быть сопоставлено с этим фактом и позволит выполнить какие-либо инициализирующие операции.
Можно проследить, как выполняется команда reset, если перед выполнением приведенных выше команд установить режим слежения среды разработки. Для этого нужно вызвать командуWatchиз менюExecutionи установить в ней флажокFacts.
Работа с базой правил. Правила
В языке CLIPSправила имеют следующий формат:
(defrule<имя правила>
< необязательный комментарий >
< необязательное объявление >
< предпосылка_1 >
< предпосылка_m>
=>
< действие_1 >
< действие_n>
)
Например:
(defrulechores
“Things to do on Sunday”
(declare (salience 10))
(today is Sunday)
(weather is warm)
=>
(assert (wash car))
(assert(chopwood))
)
В этом примере Chores– произвольно выбранное имя правила. Предпосылки условной части правила – это:
(today is Sunday)
(weather is warm)
сопоставляются затем интерпретатором с базой фактов, а действия, перечисленные в выполняемой части правила (она начинается после пары символов =>), вставят в базу два факта:
(wash car)
(chop wood)
в случае, если правило будет активизировано. Приведенный в тексте правила комментарий “ThingstodoonSunday” (Что сделать в воскресенье) поможет в дальнейшем вспомнить, чего ради это правило включено в программу. Выражение
(declare (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))
)
будет сопоставлено с фактами
(todayisSunday)
(choreiscarwash)
то в случае активизации оно включит в базу новый факт
(do carwash on Sunday)
Аналогично, правило
(defrule drop-a-chore
“Allocating chores to days”
(today is ?day)
?chore <- (do ?job on ?day)
=>
(retract ?chore) )
отменит выполнение работ по дому (?chore). Обратите внимание на то, что оба экземпляра переменной?dayдолжны получить одно и то же значение. Переменная?choreв результате сопоставления должна получить ссылку на факт (это делает оператор <-), который мы собираемся исключить из базы. Таким образом, если это правило будет сопоставлено с базой фактов, в которой содержатся
(today is Sunday)
(do carwash on Sunday)
то при активизации правила из базы будет удален факт
(do carwash on Sunday)
Отметим, что факт:
(docarwashonSunday)
будет сопоставлен с любым из представленных ниже образцов
(do ? ? Sunday)
(do ? on ?)
(do ? on ?when)
Если за префиксом ?не следует имя переменной, он рассматриваются как универсальный символ подстановки, которому может быть сопоставлен любой элемент.
При написании правил в части посылок иногда требуются некоторые логические операции, например, необходимо указать факты, что «сегодня суббота или воскресенье», «цветок не синий», «шар большой и зеленый». Это реализуется специальными логическими операторами: «ИЛИ», «НЕ», «И», которые обозначаются как |, ~, & соответственно. Таким образом, указанные выше факты запишутся следующим образом:
(todayisSaturday|Sunday)
(flower is ~blue)
(ball is big&green)