Пример 5.14. Создание копии существующего неупорядоченного факта
(deftemplate car (slot name) (slot producer) (slot type) (slot max-speed)) (assert (car (name scorpio) (producer ford) (type sedan) (max-speed 180))) (duplicate 0 (type off-road) (max-speed 130)) В приведенном примере определяется шаблон, описывающий свойства автомобиля, и добавляется факт — автомобиль Ford Scorpio с типом кузова седан и максимальной скоростью 180 (км/ч). После этого с помощью функции duplicate добавляется факт с информацией об еще одном автомобиле с похожими характеристиками — это внедорожник Ford Scorpio с максимальной скоростью 130 (км/ч). Duplicate просто облегчает нам жизнь, избавляя от излишнего ввода значений данных совпадающих слотов. В случае, если добавляемый с помощью duplicate факт уже присутствует в списке фактов, будет выдана соответствующая информация об ошибке и возвращено значение false. Факт при этом добавлен не будет. Это поведение можно изменить, разрешив существование одинаковых фактов в базе знаний. Как это сделать, было описано в разд. 5.2.3. 5.2.7. Функция assert-string Кроме функции assert, CLIPS предоставляет еще одну функцию, полезную при добавлении фактов, — assert-string. Эта функция принимает в качестве единственного аргумента символьную строку, являющуюся текстовым представлением факта (в том виде, в котором вы набираете его, например, в функции assert), и добавляет его в список фактов. Функция assert-string может работать как с упорядоченными, так и с неупорядоченными фактами. Одним вызовом функции assert-string можно добавить только один факт. Определение 5.9. Синтаксис команды assert-string (assert-string <строковое-выражение>) Строковое выражение должно быть заключено в кавычки. Функция преобразует заданное строковое выражение в факт CLIPS, разделяя отдельные слова на поля, с учетом определенных в системе на текущий момент шаблонов. Если в строке необходимо записать внутреннее строковое выражение, представляющее, скажем, некоторое поле, то для включения в строковое выражение символа кавычек используется обратная косая черта (backslash). Например, факт (book-name "clips user Guide") можно добавить следующим образом: Пример 5.15. Использование кавычек внутри строки (assert-string "(book-name V'CLIPS User Guide\")") Для добавления содержащегося в поле символа обратной косой черты используйте ее дважды. Если обратная косая должна содержаться внутри подстроки, ее необходимо использовать четыре раза. Например, для помещения в текущий список факта (a\b "c\d") необходимо вызвать функцию assert-string со следующим строковым аргументом: Пример 5.16. Использование обратной косой черты
(assert-string "(a\\b \"c\\\\d\")") Если добавления факта прошло удачно, функция возвращает индекс только что добавленного факта, в противном случае функция возвращает сообщение об ошибке и значение false. Функция assert-string не позволяет добавлять факт в случае, если такой факт уже присутствует в базе знаний (если вы еще не включили возможность присутствия одинаковых фактов). 5.2.8. Функция fact-existp В этом разделе рассмотрим очень простую, но чрезвычайно важную функцию fact-existp. Эта функция определяет, присутствует ли в данный момент факт, заданный индексом или переменной указателем, в базе знаний системы. В случае если факт присутствует в списке фактов, функция возвращает значение true, иначе — false. Определение 5.10. Синтаксис команды fact-existp (fact-existp <определение-факта>) Обычно эта функция применяется в правилах, описанных в следующей главе. Приведем простой пример использования данной функции: Пример 5.17. Использование функции fact-existp
(clear) (assert-string "(a\\b \"c\\\\d\")") (fact-existp 0) (retract 0) (fact-existp 0) Замечание He забудьте выполнить команду clear, чтобы добавленный факт имел нулевой индекс. После первого вызова функция fact-exist вернет значение true, а после удаления факта с индексом 0 — false.
|