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

Задание 2. Создать список фактов

(deftemplate person (slot name) (slot age))

(deftemplate person-pair (slot name1) (slot name2) (slot age)) ; создан дополнительный шаблон person-pair. В фактах, соответствующих этому шаблону будет храниться информация об уже найденных парах ровесников.

(deffacts Information

(person (name Joe) (age 20))

(person (name Bob) (age 20))

(person (name Joe) (age 34))

(person (name Sue) (age 34))

(person (name Sue) (age 20)))

(defrule Find-Person

(person (name ?x) (age ?z))

(person (name ?y&~?x) (age ?z))

(not (person-pair (name1 ?x) (name2 ?y) (age ?z)))

(not (person-pair (name1 ?y) (name2 ?x) (age ?z))) ; запрет повторной переработки пары или ее перестановки

=>

(printout t “name=”?x “name=”?y “age=”?z crlf)

(assert (person-pair (name1 ?x) (name2 ?y) (age ?z))))

(reset)

(run)

Использование условного элемента exists.

При вводе этот оператор автоматически заменяется двумя последовательными условными элементами not.

Например, правило

(defrule example

(exists (a ?x) (b ?x)) =>)

будет заменено на эквивалентное ему правило:

(defrule example

(not (not (and (a ?x) (b ?x)))) =>)

Упражнение 16. Условный элемент exists

(deftemplate hero ; добавление шаблона Герой

(multislot name) ; составное поле с именем героя

(slot status (default unoccupied))) ; поле, содержащее статус «не занят» по умолчанию

(deffacts goal-and-geroes ; конструктор deffacts определяет трех ничем не занятых героев и конечную цель – спасение мира

(goal save-the-world)

(hero (name Death Defying Man))

(hero (name Stupendous Man))

(hero (name Incredible Man)))

(defrule save-the-world ; правило проверяет, есть в данный момент эта цель, и в случае положительного ответа проверяет, есть ли в данный момент свободные герои.

(goal save-the-world)

(exists (hero (status unoccupied)))

=>

(printout t “The day is saved.” crlf)) ; Если все элементы правила удовлетворены система сообщает «Мир спасен».

Условный элемент forall

Условный элемент forall позволяет определить, что некоторое заданное условие выполняется для всех заданных условных элементов. Этот условный элемент автоматически заменяется комбинацией условных элементов not и and.

Например, правило

(defrule example

(forall (a ?x) (b ?x) (c ?x)) =>)

будет заменено на эквивалентное ему правило:

(defrule example

(not (and (a ?x)

(not (and (b ?x) (c ?x))))) =>)

Упражнение 17.

(defrule all-students-passed ; правило определяет, прошли ли студенты чтение, письмо и арифметику

; для активации данного правила необходимо добавление всех четырех фактов для каждого студента: (student Ivan), (reading Ivan), (writing Ivan), (arithmetic Ivan) и т.п.

(forall (student ?name)

(reading ?name)

(writing ?name)

(arithmetic ?name))

=>

(printout t “All student passed” crlf))

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

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

<условный_элемент_ logical> ::= (logical <условный_элемент>+)

Например,

(defrule ok

(logical (a))

(logical (b))

(c)

=>

(assert (d)))

Недопустимые формы записи правил с использованием условного элемента logical:

(defrule ok-1

(logical (a))

(b)

(logical (c))

=>

(assert (d)))

(defrule ok-2

(a)

(logical (b))

(logical (c))

=>

(assert (d)))

(defrule ok-3

(or (a))

(logical (b)))

(logical (c))

=>

(assert (d)))

Упражнение 18. Использование условного элемента logical

(clear)

(reset)

(defrule example

(logical (a))

(b)

=>

(assert (c)))

(assert (a) (b))

(run) ; после активации правила фактами a и b, в систему добавляется факт с, зависящий от факта а

(retract 2) ; удаление факта 2 не приводит к существенным изменениям

(retract 1) ; удаление факта а приводит к удалению связанного с ним факта с

1 Left-hand side – левая часть правила.

2 Right-hand side – правая часть правила.

13

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