我正在基于立法的专家系统上工作,我有很多类似的规则:
规则1: 如果缉获量大于3000,则扣押该量,理由法为100
规则2:如果扣押属于家庭类型,则扣押金额,依据法律200
问题是“扣押”操作只能应用一次,但是我需要保存所符合规则的历史记录,下面提供一个示例
rule "law 100"
when
$seizure: Seizure(amount>3000)
then
$seizure.getRules().add("Justification: law 100 of the civil that says bla bla");
$seizure.applyPunishment();
rule "law 200"
when
$seizure: Seizure(type == TYPES.Family)
then
$seizure.getRules().add("Justification: law 200 of the family code that says bla bla");
$seizure.applyPunishment();
如上所述,我需要“ then”部分来保存描述规则“ $ seizure.getRules()。add(“正当性:民法则”);“。我还需要“ $ seizure.applyPunishment();”已在规则1中应用,则不会在规则2中重新应用。
感谢您的咨询
答案 0 :(得分:1)
您在这里有几种选择。
将applyPunishment
更改为幂等。
您没有显示applyPunishment
的代码,但看起来像
private boolean alreadySeized = false;
public void applyPunishment() {
if (alreadySeized) {
return;
}
alreadySeized = true;
您还可以基于已经存在的其他一些变量。例如。 if (seizedAmount > 0) return;
。但是很难说没有代码怎么办。
您可以将applyPunishment
更改为markForPunishment
,类似于
private boolean markedForPunishment;
public void markForPunishment() {
markedForPunishment = true;
}
然后添加
之类的规则rule "Punish"
when
$seizure: Seizure(markedForPunishment == true)
then
$seizure.applyPunishment();
使用适当的吸气剂。
您的其他规则将调用markForPunishment
而不是applyPunishment
。
您可以使用ruleflow将正当理由与惩罚分开。
可能还有其他选择。要做的最大决定是需要MVEL解决方案还是Java解决方案。其中几个选项都需要同时更改。