(do-for-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))
Данный вызов функции выведет на экран сведения о первой тройке различных людей, имеющих одинаковый возраст. Вызовы функции neg в запросе устраняют перестановки с двумя и более одинаковыми членами. С введенными нами данными эта функция должна вывести на экран следующие объекты: [Girl-2] [Воу-2] [Воу-3].
Функция do-for-all-instance выполняет некоторое заданное действие для всех наборов объектов, удовлетворяющих запросу. Она применяет запрос к каждому набору объектов, который соответствует шаблону. Если набор объектов удовлетворяет запросу, выполняется действие, определенное пользователем. Значение, возвращенное функцией, соответствует результату вычисления действия над последним набором объектов. Если функция не нашла ни один набор объектов, удовлетворяющий запросу, то она возвращает значение false.
Определение 11.38. Синтаксис функции do-for-all-instance
(do-for-all-instance <шаблон-набора-объектов> <запрос> <действие>)
|
|
Для того чтобы вывести на экран сведения о тройках людей, имеющих одинаковый возраст, предыдущий пример можно переделать.
Пример 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 в случае, когда действие, применяемое к некоторому набору объектов, может изменить результат запроса для другого набора (конечно, кроме ситуаций, когда это подобное поведение не является желательным).