Строка, начинающаяся с modify($a)
, сообщает двигателю, что факт Заявителя обновлен.Это заставляет двигатель переоценивать все условия правила.Поскольку возраст заявителя еще не достиг 18 лет, это приводит к повторному активированию этого правила.Промойте и повторите навсегда.
Добавление no-loop
говорит двигателю, что следствие правила не должно приводить к повторной активации этого же правила.Обратите внимание, что no-loop
не является серебряной пулей против бесконечных петель;если следствие правила A заставляет активировать правило B, а следствие правила B заставляет активировать правило A, no-loop
не помешает бесконечному циклу.
Лично я считаю no-loop
обманомобойти писать лучшие условия.Лучшее решение - написать ваши условия так, чтобы они не активировались, когда не должны.Иногда это включает вставку «контрольных фактов», на которые ссылаются ваши условия, но вы часто можете просто обновить шаблон, чтобы быть более конкретным.В вашем случае решение простое:
rule "Is of valid age" when
$a : Applicant( age < 18, valid != false )
then
modify( $a ) { valid = false };
end
При добавлении valid != false
в ваш шаблон изменение факта не приведет к повторной активации этого правила.