Пример 11.57. Использование функции do-for-all-instance
(do-for-all-instance
((?pl PERSON) (?p2 PERSON) (?p3 PERSON))
(and (= ?pl:age ?p2:age ?p3:age)
(neq ?pl ?p2)
(neq ?pl ?p3)
(neq ?p2 ?p3))
(printout t ?pl " " ?p2 " " ?p3 crlf))
Помимо функции do-for-all-instance, CLIPS предоставляет еще одну функцию для осуществления некоторого действия над всеми наборами объектов — delayed-do-for-all-instance. Эта функция отличается от do-for-all-instance тем, что она группирует все наборы, которые удовлетворяют запросу, в промежуточное составное значение. Если функция не нашла ни один набор объектов, удовлетворяющий запросу, то она возвращает значение FALSE. В случае если нужные наборы были найдены, заданное действие выполняется для каждого набора из составного значения. Значение, возвращаемое функцией, является результатом заданного действия над последним набором. Так же, как и find-all-instances, эта функция может расходовать большое количество памяти. Функцию delayed-do-for-all-instance необходимо использовать вместо do-for-all-instance в случае, когда действие, применяемое к некоторому набору объектов, может изменить результат запроса для другого набора (конечно, кроме ситуаций, когда это подобное поведение не является желательным).
Определение 11.39. Синтаксис функции delayed-do-for-all-instance
(delayed-do-for-all-instance
<шаблон-набора-объектов> <запрос> <действие>)
В качестве примера рассмотрим ситуацию, когда необходимо удалить объект, представляющий самого старшего мальчика. В этом случае нужно использовать именно функцию delayed-do-for-all-instance. Действие (удаление) должно быть задержано до окончания проверки всех наборов, иначе проверяемый возраст может просто постепенно уменьшаться, и в таком случае может быть удалено больше сведений о мальчиках, чем нужно. Для проверки возраста будем использовать вложенную функцию any-instancep для поиска информации о каком-нибудь мальчике старше текущего. Полностью решение данной задачи приведено на рис. 11.32.
Рис. 11.32. Использование функции delayed-do-for-all-instances
ГЛАВА 12. Модули
CLIPS предоставляет возможность разбиения базы данных и решения задачи на отдельные независимые модули. Для создания таких модулей служит конструктор defmodule. С помощью модулей можно группировать вместе отдельные элементы базы знаний и управлять процессом доступа к этим элементам во время решения некоторой задачи. Подобный процесс управления доступа к данным напоминает механизм пространства имен, используемый в C++, и глобальные и локальные области видимости в языках С и Ada. Однако, в отличие от механизмов в перечисленных выше языках, области видимости в CLIPS строго иерархичны и однонаправлены: если модуль а может видеть данные модуля в, это не означает, что модуль в может видеть данные модуля а. С помощью управления ограничением доступа к данным, содержащимся в различных модулях, при решении сложных задач модули могут реализовывать концепцию доски объявлений (blackboard strategy — стратегия решения задач с использованием разнородных источников знаний, взаимодействующих через общее информационное поле). В этом случае отдельный модуль позволяет видеть строго определенный набор фактов и объектов правилам из других модулей. Кроме того, модули используются для управления потоком вычисления правил.
Создание модулей
Как уже упоминалось выше, для создания модулей служит конструктор defmodule.
Дата добавления: 2021-12-14; просмотров: 282;