Пример 11.56. Использование функции do-for-instance

(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 в случае, когда действие, применяемое к некоторому набору объектов, может изменить результат запроса для другого набора (конечно, кроме ситуаций, когда это подобное поведение не является желательным).


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: