Функция на левой стороне правила на слюни

Рассмотрим следующее правило для "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 (но никогда, как вы пытались, никогда не в качестве шаблона).

Чтобы избежать цикла, добавьте ограничение, которое не выполняется после изменения.

Другие вопросы по тегам