Пример 6.41. Правило all-students-passed


 

(defrule all-students-passed

(forall (student ?name)

(reading ?name)

(writing ?name)

(arithmetic ?name))

=>

(printout t "All students passed." crlf))

 

Заметьте, что данное правило удовлетворяется, пока нет ни одного студента. При добавлении факта (student Bob) правило перестает удовлетворяться, т. к. нет фактов, подтверждающих, что Bob прошел все необходимые пред­меты. Правило не начнет удовлетворяться и после добавления фактов (reading Bob) и (writing Bob). А вот после добавления факта (arithmetic Bob) правило будет активировано и сможет вывести на экран соответст­вующую запись. Если добавить факт (student John), правило опять пере­станет удовлетворяться, т. к. один из студентов (John) не прошел все необ­ходимые предметы. Используя условный элемент exists, вы без труда смо­жете изменить это правило так, чтобы оно не выполнялось в случае отсутствия студентов.

Так как реализация forall использует условный элемент not, то forall, так же как и not, test и exists, может привести к автоматическому добавлению образцов initial-fact или initial-object в левую часть правила. Незабы­вайте использовать команду reset для корректной работы этого условного элемента.

6.5.8. Условный элемент logical

Условный элемент logical предоставляет механизм поддержки достоверно­сти для созданных правилом данных (фактов или объектов), удовлетворяю­щих образцам. Данные, созданные в правой части правила, могут иметь ло­гическую зависимость от данных, удовлетворивших образцы в левой части правила. Такая зависимость называется логической поддержкой. Данные могут зависеть от группы данных или нескольких групп данных, удовлетво­ривших одно или несколько правил. Если удаляются данные, которые под­держивают некоторые другие данные, то зависимые данные также автома­тически удаляются.

Если некоторые данные созданы без логической поддержки (например, с помощью конструкторов deffacts, definstance или командыassert, введенной пользователем или вызванной в правой части правила), то считает­ся, что они имеют безусловную поддержку. Безусловная поддержка удаляет все присутствующие в данный момент условные поддержки этих данных (но не удаляет сами данные). Дальнейшая логическая поддержка для данных с безусловной поддержкой игнорируется. Удаление правила, которое вызва­ло логическую поддержку для данных, удаляет логическую поддержку, сгенерированную этим правилом (но не удаляет данные, если у них еще есть логическая поддержка, сгенерированная другим правилом).

Определение 6.23. Синтаксис условного элементаlogical

<условный-элемент-1од!са1> ::= (logical <условный-элемент>+)

Условный элемент logical группирует образцы, так же как это делает and. Данное свойство можно использовать при объединении элементов and, or и not. Однако только первые п образцов правила могут использоваться в условном элементе logical. Например, следующее правило записано верно:

Пример 6.42. Правильный вариант использования условного элемента logical

(defrule ok

(logical (a))

(logical (b))

(c)

=>

(assert (d)))

А такое объявление правил недопустимо:

Пример 6.43. Неправильные варианты использования условного элемента logical

 

(defrule not-ok-1

(logical (a))

(b)

(logical (с))

=>

(assert (d)))

(defrule not-ok-2

(a)

(logical (b))

(logical (c))

=>

(assert (d)))

(defrule not-ok-3

(or (a)

(logical (b)))

(logical (c))

=>

(assert (d)))

Рассмотрим следующий пример. Включите просмотр списка фактов с по­мощью пункта Facts Windowменю Windows,это поможет следить за тем, что происходит в момент выполнения программы.

 



Дата добавления: 2021-12-14; просмотров: 274;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.011 сек.