CLIPS предоставляет возможность разбиения базы данных и решения задачи на отдельные независимые модули. Для создания таких модулей служит конструктор defmodule. С помощью модулей можно группировать вместе отдельные элементы базы знаний и управлять процессом доступа к этим элементам во время решения некоторой задачи. Подобный процесс управления доступа к данным напоминает механизм пространства имен, используемый в C++, и глобальные и локальные области видимости в языках С и Ada. Однако, в отличие от механизмов в перечисленных выше языках, области видимости в CLIPS строго иерархичны и однонаправлены: если модуль а может видеть данные модуля в, это не означает, что модуль в может видеть данные модуля а. С помощью управления ограничением доступа к данным, содержащимся в различных модулях, при решении сложных задач модули могут реализовывать концепцию доски объявлений (blackboard strategy — стратегия решения задач с использованием разнородных источников знаний, взаимодействующих через общее информационное поле). В этом случае отдельный модуль позволяет видеть строго определенный набор фактов и объектов правилам из других модулей. Кроме того, модули используются для управления потоком вычисления правил.
|
|
Создание модулей
Как уже упоминалось выше, для создания модулей служит конструктор defmodule.
Определение 12.1. Синтаксис конструктора defmodule
(defmodule <имя-модуля>
[<комментарии>]
<спецификации-импорта-экспорта>*)
<спецификация-импорта-экспорта>::=
(export <элемент-слецификации>) |
(import <имя-модуля> <элемент-спецификации>
<элемент-спецификации>::=?ALL |
?NONE |
<конструктор>?ALL |
<конструктор>?NONE |
<конструктор> <имя-конструктора>
<конструкция>:= deftemplate | defclass | defglobal | deffunction | defqeneric
После своего создания модуль не может быть переопределен или удален (за исключением системного модуля main, который пользователь может один раз переопределить). Единственный способ удалить существующий модуль — выполнить команду clear. Во время запуска системы и при вызове команды clear CLIPS автоматически создает предопределенный системный модуль, указанный ниже.