Функция на левой стороне правила на слюни
Рассмотрим следующее правило для "location" r и s:
∀r,s[(danger(r)∧adjacent(r,s))→danger(s)]
Я попытался реализовать следующим образом:
function boolean adjacent(Location l1, Location l2) {
if (l1.x == l2.x)
return Math.abs(l1.y - l2.y) == 1;
if (l1.y == l2.y)
return Math.abs(l1.x - l2.x) == 1;
return false;
}
rule danger
when
$s : Location(danger == true)
$r : Location()
adjacent($s,$r)
then
modify($r) { setDanger(true) }
end;
Но это не компилирует высказывание, что смежные не могут быть решены. Я пробовал eval(смежный ($s,$r)), но он не работает, потому что rete постоянно посещает одни и те же комбинации $ s и $ r.
Я попытался реализовать метод рядом с (Location), но он также не компилируется:
$r : Location(adjacent($s) == true)
Я подумал о некоторых альтернативах, таких как: создание каждого местоположения имеет список смежных местоположений; и т.д. Но ни один из них не звучал правильно для меня.
Как бы правильно сделать это?
1 ответ
rule danger
when
$s : Location( danger )
$r : Location(! danger, adjacent($s,$r) )
then
modify($r) { setDanger(true) }
end
Вы можете написать логическое выражение как ограничение или внутри eval CE (но никогда, как вы пытались, никогда не в качестве шаблона).
Чтобы избежать цикла, добавьте ограничение, которое не выполняется после изменения.