0

「場所」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(adjacent($s,$r)) を試しましたが、rete が $s と $r の同じ組み合わせを永遠に訪問し続けるため、機能しません。

Location に隣接する () メソッドを実装しようとしましたが、どちらもコンパイルされません。

$r : Location(adjacent($s) == true)

次のようないくつかの代替案を考えました。各場所に隣接する場所のリストを作成します。などしかし、どれも私にはぴったりではありませんでした。

これを実装する正しい方法はどのようになりますか?

4

1 に答える 1

2
rule danger
when
  $s : Location( danger )
  $r : Location(! danger, adjacent($s,$r) )
then
    modify($r) { setDanger(true) }
end

ブール式を制約として、または eval CE 内に記述することができます (ただし、試みたように、単独でパターンとして記述することはできません)。

ループを回避するには、変更後に失敗する制約を追加します。

于 2016-04-20T10:23:27.993 に答える