Добавил:
liisakochik@gmail.com Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Мага. 1 семестр / SerpBook_CLIPS_main.pdf
Скачиваний:
0
Добавлен:
04.01.2026
Размер:
1.23 Mб
Скачать

В этом примере создан абстрактный шаблон с именем 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