4. Операторы в левой части продукци

D:<фрагмент> - удалить фрагмент из БЗ, если продукция применима;

N:<фрагмент> - нет (проверить отсутствие фрагмента в БЗ);

B:<фрагмент> - выполнить встроенную процедуру (встроенный предикат), связанный с фрагментом.

Пример 4.1. (использование оператора удалить - D:).

UR3():IF ИМЯ(ИВАН1,X1) D:УМНЫЙ(X1) THEN СПОСОБНЫЙ(X1);

Пусть БЗ имеет вид:

ИМЯ(ИВАН,А1) УМНЫЙ(А1)

ИМЯ(ИВАН,А2) ГЛУПЫЙ(А2)

Тогда продукция T1:UR3() будет применимой (см. пример 2.1). Из БЗ будет изъят фрагмент УМНЫЙ(А1) и добавлен СПОСОБНЫЙ(А1).

Пример 4.2. (использование оператора нет - N:).

UR4():IF ИМЯ(ИВАН,X1) N:УМНЫЙ(X1) THEN ГЛУПЫЙ(X1);

При вызове T!:UR4() вначале (см. пример 2.1) будет означена X1=А1. Далее будет проверяться отсутствие фрагмента УМНЫЙ(А1) в БЗ. Но он есть. Поэтому в данном варианте продукция будет не применимой. Далее берется X1=А2. Будет проверяться отсутствие фрагмента УМНЫЙ(А2) в БЗ. Такого фрагмента нет. Поэтому к БЗ будет добавлен фрагмент ГЛУПЫЙ(А2).

При вызове T:UR4() фрагмент ГЛУПЫЙ(А2) будет добавляться к БЗ до бесконечности. Чтоб этого не было, следует вставить еще один оператор "нет":

UR4():IF ИМЯ(ИВАН,X1) N:УМНЫЙ(X1) N:ГЛУПЫЙ(X1) THEN ГЛУПЫЙ(X1);

Пример 4.3. (использование оператора выполнить - B:).

UR5():IF SUB(СТУДЕНТ,X1) D:ВОЗРАСТ(X1,X2) В:+(X2,1,X3) THEN

ВОЗРАСТ(X1,X3);

Пусть в БЗ представлен возраст студентов:

SUB(СТУДЕНТЫ,СТ_1) ВОЗРАСТ(СТ_1,20)

SUB(СТУДЕНТЫ,СТ_2) ВОЗРАСТ(СТ_1,18) ...

Тогда при вызове T!:UR5() начале будет означено: X1=СТ_1, X2=20.

Оператор сложения В:+(X2,1,X3) добавит к 20 число 1 и означит X3=21.

Из БЗ будет изъят фрагмент ВОЗРАСТ(СТ_1,20) и добавлен ВОЗРАСТ(СТ_1,21).

При повторном применении из БЗ будет изъят фрагмент ВОЗРАСТ(СТ_2,18) и добавлен ВОЗРАСТ(СТ_2,19). В результате в БЗ к каждому студенту будет добавлено по одному году.

Предыдущий раздел|Следующий раздел

- Главная страница -