Представление бизнес-правила как модели ограничений для поиска набора решений

В моем корпоративном приложении у меня есть бизнес-правила, такие как:

  1. ((AMOUNT < 20000.00) || ((AMOUNT >= 20000.00) && (RISKEXPOSURE == 'N')))
  2. (ind = A1 || ind = A2 || ind = A3 || ind = S1 || ind = S2 || ind = S9)

Как видите, правило состоит из бизнес-выражений, например: (AMOUNT < 20000.00), В правилах может быть любое количество бизнес-условий, к которым присоединяются логические операторы && а также ||, Идентификаторы AMOUNT, RISKEXPOSURE а также ind бизнес-переменные (которые могут варьироваться от 1 до n в зависимости от предметной области).

Мое требование состоит в том, чтобы найти те выражения, когда они истинны, и сделать все правило истинным. Например: для бизнес-правила № 1 - все правило будет истинным, если:(AMOUNT < 20000.00) верно или ((AMOUNT >= 20000.00) && (RISKEXPOSURE == 'N')) верно, следовательно, мой вывод должен быть:

Решение № 1: (AMOUNT < 20000.00)

Решение № 2: ((AMOUNT >= 20000.00) && (RISKEXPOSURE == 'N'))

Аналогично для бизнес-правила № 2:

Решение № 1:ind = A1

Решение № 2:ind = A2

Решение № 3:ind = A3

Решение № 4:ind = S1

Решение № 5:ind = S2

Решение № 6:ind = S9


Что я пробовал:

Поскольку каждое бизнес-выражение может быть либо истинным, либо ложным, я изменил свое бизнес-правило # 1 как (A || ( B && C ) ), Я использовал библиотеку логики высказываний от http://tweetyproject.org/. Это дает мне результаты, но я не могу применить ограничение, такое как XOR. В моем примере A и B являются взаимоисключающими, но мои результаты возможны. Представляя правило в виде таблицы истинности, я получаю все следующие истинные условия

011,100,101,110,111

Однако мой результат должен быть только 100, 011

Это привело меня к поиску альтернатив, и ответ здесь предложил решение проблем. Я читал о Решателе Чоко. Но я не уверен, как мое бизнес-правило может быть представлено в модели, приемлемой для решателя. Любая помощь с благодарностью.

2 ответа

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

У вас есть выражение (A || ( B && C ) )= БОЛЬШОЙ Затем вы найдете комбинации возможных значений: например,

[[001],[010],[011]...[111]]

Для каждого из них замените значения в вашем БОЛЬШОМ выражении и сравните результат с выражением, вычисленным с помощью противоположного значения выражения, которое вы хотите - [101] with [001] | [110] with [010] и для каждой комбинации результат - разница, вы находите выражение. Затем переключитесь на следующий индекс и сделайте это снова

Я бы порекомендовал вам посмотреть на решение SMT. Это естественно позволяет решить поставленную задачу. Вы вводите любое разумное количество ограничений (как целочисленных, так и логических) и переменных. По сути, он пытается удовлетворить уравнение с учетом некоторых ограничений. Он найдет первое удовлетворительное задание для вашей задачи.

Ссылки для изучения:

  1. Z3
  2. CVC4
  3. yices2

Имейте в виду, что время выполнения и производительность сильно зависят от самой проблемы: ограничений, констант, точных значений.

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