Не существует объекта ограничения Drools, чье поле-член содержит значение, отличное от P

Я понимаю, что название сумасшедшее, но это действительно лучшее, что я могу придумать. Если у кого-то есть лучшие предложения, пожалуйста, оставьте их в комментариях, и я отредактирую.

Этот вопрос является продолжением вопроса, заданного здесь: объект Drools Constraint, отличный от P, найден в коллекции

Для тех, кто не хочет нажимать, в этом посте описывается решение ситуации, в которой вы хотите узнать, существует ли факт CustomType, у которого есть поле участника, содержащее значение, отличное от P. Решение этой проблемы закончилось быть следующим:

$c: CustomType()
exists Object(this != objectP) from $c.collection

Приведенный выше код прекрасно работает. Моя проблема в том, что я хочу знать, когда не существует объекта типа CustomType с этим свойством. Теперь, поскольку строка 2 опирается на связанную переменную, заданную в строке 1, мы не можем просто отрицать строку 1 с помощью оператора not. Это приведет к исключению времени выполнения. Вот как я интуитивно хочу написать код, но имейте в виду, что он не работает:

not $c: CustomType()
exists Object(this != objectP) from $c.collection

Я не могу просто отрицать строку 2, потому что тогда правило потребует наличия хотя бы одного объекта CustomType. Я хочу знать, когда первый пример кода не так.

Мой внутренний дурачок говорит мне, что оригинальное Решение может быть ошибочным. В идеале мы хотели бы выразить строку 2 в скобках () CustomType. Это будет выражать что-то более похожее на "существует CustomType со свойством", а не "существует CustomType, и есть объект со свойством". Первое можно отрицать с помощью оператора not, но я не уверен, что делать с последним.

1 ответ

Решение

Когда вам нужно работать с такими ограничениями, которые должны быть выражены в нескольких строках, и отрицаниями их, я думаю, что вы движетесь в мир вывода и поддержания истины:

http://blog.athico.com/2010/01/drools-inference-and-truth-maintenance.html

т.е. ваши правила могут быть примерно такими:

rule "Determine presence of non-P objects" when
    $c: CustomType()
    exists Object(this != objectP) from $c.collection
then
    insertLogical( new ContainsNonP($c) );
end

rule "There are some non-P objects" when
    $c: CustomType()
    exists ContainsNonP(customType == $c)
then
    ...
end

rule "There are no non-P objects" when
    $c: CustomType()
    not exists ContainsNonP(customType == $c)
then
    ...
end

Обратите внимание, что последнее правило может активироваться, если первое правило еще не активировано. Если порядок активаций важен для ваших правил, вы можете определить некоторые особенности.

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