Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ЛР_4_Правила.doc
Скачиваний:
2
Добавлен:
01.03.2025
Размер:
419.33 Кб
Скачать

Связывающие ограничения:

& – логическое И (применяется для объединения с другими ограничениями или связывания переменных); | – логическое ИЛИ; ~ – логическое НЕ

Например, ?х&(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))

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]