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). В результате в БЗ к каждому студенту будет добавлено по одному году.
Предыдущий раздел|Следующий раздел