Пример 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;