
- •Лабораторная работа № 4. Использование глобальных переменных в правилах
- •Свойства правил
- •Стратегия разрешения конфликтов
- •Синтаксис левой (условной) части правила
- •Использование переменных в правилах
- •Связывающие ограничения:
- •Предикатные ограничения
- •Ограничения, возвращающие значения
- •Использование образцов объектов
- •Адрес образца
- •Задание 2. Создать список фактов
- •Использование условного элемента exists.
- •Условный элемент forall
- •Условный элемент logical
Связывающие ограничения:
& – логическое И (применяется для объединения с другими ограничениями или связывания переменных); | – логическое ИЛИ; ~ – логическое НЕ
Например, ?х&(red|blye)
Упражнение 7. Правило Find-2-Person
(defrule Find-2-Person
(person (name ?x) (age ?z))
(person (name ?y&~?x) (age ?z)) ; ?y&~?x – запрет выводить одинаковые имена (Bob-Bob), но все равно эквивалентные имена: Bob-Sue, Sue-Bob
=>
(printout t “name=”?x “name=”?y “age=”?z crlf))
(run)
Предикатные ограничения
Предикатные ограничения – ограничения, основанные на истинности некоторого логического выражения.
Предикатные ограничения вызывают предикатные функции, которые возвращают значения FALSE (ложь) и НЕ-FALSE или TRUE (истина).
Запись предикатного ограничения:
:<вызов-функции>.
Упражнение 8. Правило Find-data
(defrule Find-data
(data ?x&:(floatp ?x) $?y ?z&:(stringp ?z)) ; здесь происходит поиск неявно созданного шаблона data, первое поле которого – вещественное число, а последнее – строка
=>
(printout t “x=”?x “y=”?y “z=”?z crlf))
(run)
Ограничения, возвращающие значения
=<функция>
Упражнение 9. Использование ограничений-функций.
(assert (data 1 2)
(data 2 3)
(data 2 4))
(defrule Find-data
(data ?x ?y&=(* 2 ?x))
=>
(printout t “x=”?x “y=”?y crlf))
(run)
Использование образцов объектов
<образец объекта> ::= (object <атрибуты-ограничения>)
<
атрибуты
ограничения > ::= (is-a)
<ограничение>) |
(name
<ограничение>) |
(slot
<ограничение>)
Упражнение 10. Использование образцов
(defrule example-1
(object (is-a MyOb1| MyOb2)) ; правило, удовлетворяющее любой объект из классов MyOb1 или MyOb2
=>)
(defrule example-2 ; правило, которое активируется парой объектов, принадлежащих различным классам
(object (is-a ?x))
(object (is-a ~?x))
=>)
(defrule example-3
(object (width ?x&(> ?x 20)) ; правило активируется в том случае, если будет найдет объект, содержащий слот width со значением больше 20
=>)
(defrule example-4
(object (width ?x) (height ?x) ; правило активируется, если будет найден объект, содержащий слоты width и height, значения которых равны
=>)
Адрес образца
<адрес образца> :: = ?<имя переменной>
<- <образец>
Упражнение 11. Удалить все факты data.
(defrule del-data-facts
?data- facts <- (data $?) ; вся эта строка представляет собой адрес образца
=>
(retract ?data-facts) ; в правой части функция retract оперирует с образцами, содержащимися в левой части
Упражнение 12. Использование условного элемента test для наложения дополнительных ограничений на факты
(defrule example
(data ?x)
(data ?y)
(test (>= (abs (- ?y ?x)) 3)) ; это правило находит пару фактов data, для которых разница между значениями первых полей этих фактов должна быть больше или равна 3
=>)
Упражнение 13. Использование условного оператора OR
(defrule system-fault ; данное правило сообщит о поломке системы, если в списке фактов будет присутствовать один из фактов temp high, value problem или pump off
(error-status unknown)
(or (temp high)
(value problem)
(pump off))
=>
(printout t “The system has a fault.” crlf))
Упражнение 14. Использование условного оператора AND
(defrule system-flow ; данное правило сообщит о поломке системы, если в списке фактов будет присутствовать одно из сочетаний фактов: temp high и value closed или temp low и value open
(error-status confirmed)
(or (and (temp high)
(value closed))
(and (temp low)
(value open)))
=>
(printout t “The system is having a flow problem.” crlf))
Упражнение 15. Использование условного оператора NOT
(defrule nothing-to-schedule; данное правило сообщит о поломке системы, если в списке фактов будет присутствовать одно из сочетаний фактов: temp high и value closed или temp low и value open
(not (schedule ?))
=>
(printout t “Nothing to schedule.” crlf))