Определение набора объектов
Набор объектов (instance-set) — это упорядоченная коллекция объектов, определенных пользователем классов. Каждый член набора объектов (instance-set member) — объект некоторого набора классов, называемых ограничениями классов (class restrictions). Различные ограничения классов могут задаваться для каждого члена набора объектов. Ограничения вместе с переменными (instance-set member variables), с которыми будут связываться соответствующие члены набора, называются шаблоном набора (instance-set templates). Функции запросов используют шаблон для генерации самого набора объектов. В ограничении классов может быть задан модуль (см. гл. 12), где определен класс. Если модуль не задан, будут использоваться определения классов, созданных в текущем модуле. Определение 11.30. Синтаксис шаблона набора объектов <шаблон-набора-объектов>::= (<члены-шаблона-наборов-объекта>) <член-шаблона-наборов-объекта>::=(<переменная-набора-объектов> <ограничения-классов>) <переменная-набора-объектов>::= <простая-переменная> <ограничения-классов>::= <имена-классов> В качестве примера можно привести шаблон, выбирающий пары объектов персон противоположного пола. Пример 11.47. Шаблон, выбирающий пары персон противоположного пола ((?man-or-boy BOY MAN) (?woman-or-girl GIRL WOMAN)) Этот шаблон можно представить также в эквивалентной форме. Пример 11.48. Эквивалентная форма предыдущего шаблона ((?man-or-boy MALE) (?woman-or-girl FEMALE)) В данном примере переменные?man-or-boy и?woman-or-giri ограничиваются только с помощью имен классов. Создание набора объектов COOL использует прямой перебор для генерации наборов объектов, которые соответствуют шаблону для существующих в системе объектов по перечисленным ниже правилам: 1. Если шаблону удовлетворяет более одного набора, то элементы набора изменяются справа налево. 2. Если в ограничениях классов задано более одного класса, они перебираются слева направо. 3. Экземпляры объектов, определенные в системе, рассматриваются в порядке их создания. Для шаблона, приведенного в предыдущем разделе, CLIPS сгенерирует 30 наборов объектов в следующем порядке: 1. [Воу-1] [Girl-1] 16. [Boy-4] [Girl-1] 2. [Воу-1] [Girl-2] 17. [Boy-4] [Girl-2] 3. [Boy-1] [Woman-1] 18. [Boy-4] [Woman-1] 4. [Boy-1] [Woman-2] 19- [Boy-4] [Woman-2] 5. [Boy-1] [Woman-3] 20. [Boy-4] [Woman-3] 6. [Boy-2] [Girl-1] 21. [Man-1] [Girl-1] 7. [Boy-2] [Girl-2] 22. [Man-1] [Girl-2] 8. [Boy-2] [Woman-1] 23. [Man-1] [Woman-1] 9. [Boy-2] [Woman-2] 24. [Man-1] [Woman-2] 10. [Boy-2] [Woman-3] 25. [Man-1] [Woman-3] 11. [Boy-3] [Girl-1] 26. [Man-2] [Girl-1] 12. [Boy-3] [Girl-2] 27. [Man-2] [Girl-2] 13. [Boy-3] [Woman-1] 28. [Man-2] [Woman-1] 14. [Boy-3] [Woman-2] 29. [Man-2] [Woman-2] 15. [Boy-3] [Woman-3] 30. [Man-2] [Woman-3] Пример 11.49. Шаблон, выбирающий пары персон женского пола ((?fl FEMALE) (?f2 FEMALE)) Шаблон из примера 11.49 приведет к генерации 25 наборов объектов:
10.[Girl-1] [Girl-1] 14. [Woman-1] [Woman-2] 11.[Girl-1] [Girl-2] 15. [Woman-1] [Woman-3] 12.[Girl-1] [Woman-1] 16. [Woman-2] [Girl-1] 13.[Girl-1] [Woman-2] 17. [Woman-2] [Girl-2] 14.[Girl-1] [Woman-3] 18. [Woman-2] [Woman-1] 15.[Girl-2] [Girl-1] 19. [Woman-2] [Woman-2] 16.[Girl-2] [Girl-2] 20. [Woman-2 [Woman-3] 17.[Girl-2] [Woman-1] 21. [Woman-3] [Girl-1] 18.[Girl-2] [Woman-2] 22. [Woman-3] [Girl-2] 16. [Girl-2] [Woman-3] 23. [Woman-3] [Woman-1] 17. [Woman-1] [Girl-1] 24. [Woman-3] [Woman-2] 18. [Woman-1] [Girl-2] 25. [Woman-3] [Woman-3] 19. [Woman-1] [Woman-1]
Порядок генерации приведенных выше шаблонов обусловлен в первую очередь тем, что объекты класса girl рассматриваются перед объектами класса woman, т. к. сам класс girl был определен раньше класса woman. Определение запроса Запрос — это определенное пользователем логическое выражение, применяемое к набору объектов для установления дополнительных ограничений для членов набора. Если значение логического выражения не равняется false, то считается, что набор объектов удовлетворяет запросу. Определение 11.31. Синтаксис запроса <запрос>::=(<логическое-выражение>) Предположим, что необходимо найти пары противоположного пола одного возраста. Для этого следует использовать запрос, представленный в примере 11.50. Пример 11.50. Запрос, накладывающий ограничение на возраст (= (send?man-or-boy get-age) (send?woman-or-girl get-age)) В запросе можно обращаться к слотам членов набора объекта напрямую при помощи краткой нотации, скрывающей использование сообщений.
|