- •Оглавление
- •Предисловие
- •1. Общие сведения о языке и среде разработки CLIPS
- •1.1. Системы продукций и CLIPS
- •1.2. Основы работы в консоли CLIPSJNI
- •1.3. Основы работы в среде CLIPSWin
- •1.4. Механизмы представления знаний в CLIPS
- •1.5. Пример разработки БЗ и работы с ней в среде CLIPS
- •1.6. Пример использования эвристического механизма представления знаний совместно с процедурным
- •2. Основные конструкции языка CLIPS
- •2.1. Примитивные типы данных языка CLIPS
- •2.2. Особенности вызова функций в языке CLIPS
- •2.3. Факты в языке CLIPS
- •2.3.1. Позиционные факты
- •2.3.2. Непозиционные факты
- •2.4. Операции над фактами
- •2.5. Правила в языке CLIPS
- •2.5.1. Объявление и добавление новых правил
- •2.5.2. Один из подходов к разрешению конфликтов
- •2.6. Групповые символы для простых и составных полей
- •2.7. Переменные в CLIPS
- •2.8. Глобальные переменные
- •2.9. Пользовательские функции
- •3. Примеры построения простых интеллектуальных систем
- •3.1. Разработка простейшей экспертной системы
- •3.2. Пример решения задач на планирование
- •3.2.1. Программа ”Робот и ящик”
- •3.2.2. Запуск и трассировка программы ”Робот и ящик”
- •3.3. Пример использования ООП в CLIPS.
- •Приложение 2. Использование образцов в правилах.
- •Приложение 3. Стратегии разрешения конфликтов
- •Приложение 4. Работа с модулями в CLIPS
- •Литература и Интернет-ресурсы
В этом примере создан абстрактный шаблон с именем car, в котором имеется 2 простых слота для хранения цвета и модели автомобиля и один составной слот для хранения данных о владельце.
Упражнение 2.3.
•Выполнить действия, как в упражнении 2, для двух рассмотренных выше шаблонов.
•Используя опцию меню Browse, открыть менеджер шаблонов, а затем менеджер фактов. Выбирать имена описаний шаблонов и фактов, а затем нажимать кнопку pprint (рис. 2.2).
•Описание шаблона car и набора фактов сохранить в файле _pr_2_01.
2.4. Операции над фактами
Факты можно добавлять к списку фактов (assert), удалять из списка фактов (retract), изменять (modify), дублировать (duplicate). Рассмотрим работу с базой фактов в CLIPS на практике.
Функция assert – добавление факта в список
Функция assert принимает в качестве параметров последовательность фактов, которые подлежат добавлению в список фактов. Синтаксическую структуру вызова функции assert можно представить следующим образом:
(assert <факт> <факт> <факт>)
Для того чтобы иметь возможность наблюдать процесс добавления, удаления или изменения фактов надо вызвать Execution –> Watch и установить флажок напротив пункта «Facts» (рис. 2.3).
Рис 2.3. Установка параметров трассировки
Рассмотрим пример использования функции assert. Если в диалоговом окно CLIPS ввести следующее выражение
(assert (weather is fine))
32
то в список фактов будет добавлен новый факт (weather is fine) и в окне диалога появится сообщение:
==> f-0 (weather is fine) <Fact-0>
означающее, что факт был добавлен в систему и получил номер 0. При успешном выполнении функция assert возвращает адрес последнего добавленного факта. Если во время добавления некоторого факта произошла ошибка, команда прекращает свою работу и возвращает значение FALSE.
Проверить текущее состояние списка фактов можно либо посредством ввода в диалоговом окне команды (facts), либо вызвав Window –> Facts. Во втором случае откроется окно со списком фактов. При добавлении факта можно использовать вызовы функций, например выполнение:
(assert (totalcost (* 10 13))
вызовет функцию умножения и ее результат запишется в качестве поля факта. При этом в память добавится факт (totalcost 130). Для очистки памяти используют команду (clear)
В том случая если определен шаблон для неупорядоченных фактов, то добавлять факты надо путем указания имени их шаблона с перечислением имен и значений слотов. Например, для определенного ранее шаблона car добавление фактов будет иметь вид:
(assert(car (model “Scoda-Fabia”) (owner Nina)) ) (assert(car (model Volvo) (color black)) ) (assert(car (owner Masha) (color yello)) )
Проверьте добавление фактов в систему. Обратите внимание, что для всех фактов мы используем одно и то же имя шаблона. Для факта не существует имени в его классическом понимании. Идентификатором факта служит его индекс или адрес.
Функция modify– изменение шаблонных фактов
В качестве параметра функция принимает определение факта (индекс факта или переменную-адрес), а также новые значения для нужных слотов. Если обратиться к предыдущему примеру, то в нем мы забыли указать для Niana цвет авто. Выполнив команду (facts) или открыв окно Facts, можно определить, что факт, который надо редактировать имеет индекс f-5. Тогда можно выполнить следующую команду:
CLIPS> (modify 5 (color white))
<== f-5 (car (color nil) (model "Scoda-Fabia") (owner Nina)) ==> f-8 (car (color white) (model "Scoda-Fabia") (owner Nina)) <Fact-8>
33
Как видно из протокола выполнения этой команды, в факт для Nina был добавлен белый цвет автомобиля, но при этом сам факт изменил индекс с 5 на 8. По сути, команда modify удаляет существующий факт и добавляет новый. В списке так и осталось 8 фактов, но их индексы изменяются от 0 до 9, а факт с индексом 5 отсутствует.
Рис 2.4. Результат работы команды modify.
Упражнение 2.4.
Используя ранее созданный шаблон и набор фактов car, выполните из консоли CLIPS операции по добавлению, модификации и удалению фактов.
Функция retract – удаление фактов
Каждым вызовом этой функции можно удалить произвольное число фактов. Если включен режим трассировки, то сообщение об удаление будет отображаться в окне CLIPS при удалении каждого факта. Синтаксическую структуру вызова функции retract можно представить следующим образом:
(retrасt <определение-факта> <определение-факта> …) или
(retrасt *)
Аргумент <определение-факта> может являться либо переменной, связанной с адресом факта (адрес факта возвращается командой assert), либо индексом факта без префикса (например, 3 для факта с индексом f-3), либо выражением, вычисляющим этот индекс (например, (+ 1 2) для факта с индексом f-3). Если в качестве аргумента функции retract использовался символ «*», то из текущего списка будут удалены все факты. Функция retract не имеет возвращаемого значения. Рассмотрим пример:
(clear)
(assert (а) (b) (с) (d) (e) (f)) (retract 0 (+ 0 2) (+ 0 2 2))
Результатом выполнения приведенной выше последовательности команд будет: очистка списка фактов, добавление в систему шести фактов и, наконец, удаление из системы фактов с номерами 0, 2 и 4. Обратите внимание, как меняется список фактов в окне Facts с каждой выполненной
34
