Не существует объекта ограничения 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
Обратите внимание, что последнее правило может активироваться, если первое правило еще не активировано. Если порядок активаций важен для ваших правил, вы можете определить некоторые особенности.