在Drools中查找语法错误

在Drools中查找语法错误,drools,Drools,我有一个流口水的档案,里面的第二条规则总是被证明是正确的 rule "R2" salience 1000 when ((residence status = "US Citizen") || ((residence status = "Lawfully-entered Alien") and (residence duration >= 5))) and (fpl <= 133) then Add to Programs List "3" end 为什么它总是进入它,尽管对于

我有一个流口水的档案,里面的第二条规则总是被证明是正确的

rule "R2"
salience 1000

when

((residence status = "US Citizen") || ((residence status = "Lawfully-entered Alien") and (residence duration >= 5))) and (fpl <= 133)
then

Add to Programs List "3"
end
为什么它总是进入它,尽管对于指定的值,条件是假的

请查找所有文件

package com.eligibility.service;  


import com.platform.enrollment.domain.BasicInfo;
import com.platform.enrollment.domain.FamilyMember;
global java.util.List prog_id_list; 
global java.lang.Double fpl;

[condition][] and=and 
[condition][] or=or

[condition][]residence status \= "{value}"=FamilyMember(basicInfo.citizenshipStatus == "{value}")
[condition][]residence duration >\= {value}=FamilyMember(basicInfo.permanentResidenceDuration >= {value})
[condition][]job status \= "{value}"=FamilyMember(basicInfo.jobStatus == "{value}")
[condition][]large business status \= "{value}"=FamilyMember(basicInfo.largeBusinessStatus == "{value}")
[condition][]false=eval(false)
[condition][]true=eval(true)
[condition][]age \= {value}=FamilyMember(basicInfo.getAge=={value})
[condition][]age < {value}=FamilyMember(basicInfo.getAge<{value})
[condition][]age > {value}=FamilyMember(basicInfo.getAge>{value})
[condition][]age <\= {value}=FamilyMember(basicInfo.getAge<={value})
[condition][]age >\= {value}=FamilyMember(basicInfo.getAge>={value})

[condition][]fpl \= {value}=eval(fpl=={value})
[condition][]fpl < {value}=eval(fpl<{value})
[condition][]fpl > {value}=eval(fpl>{value})
[condition][]fpl <\= {value}=eval(fpl<={value})
[condition][]fpl >\= {value}=eval(fpl>={value})

[condition][]gender \= "{value}"=FamilyMember(basicInfo.gender == "{value}")

[condition][]pregnant \= true=Applicant(eval(pregnant))
[condition][]pregnant \= false=Applicant(eval(!pregnant))

[condition][]Family member age greater than or equal to 60 \= true=eval(any_member_greater_than_equal_to_60)
[condition][]Family member age greater than or equal to 60 \= false=eval(!any_member_greater_than_equal_to_60)

[condition][]job status \= "{value}"=Applicant(eval(job_status.contains("{value}")))

[condition][]large business status \= "{value}"=Applicant(eval(large_business_status.contains("{value}")))
[condition][]employer benefits \= "{value}"=Applicant(eval(large_business_status.contains("{value}")))

[condition][]spouse \= true=eval(spouse)
[condition][]spouse \= false=eval(!spouse)

[condition][]total assets \= {value}=eval(total_assets=={value})
[condition][]total assets < {value}=eval(total_assets<{value})
[condition][]total assets > {value}=eval(total_assets>{value})
[condition][]total assets <\= {value}=eval(total_assets<={value})
[condition][]total assets >\= {value}=eval(total_assets>={value})

[condition][] Question with code "{code}" has answer "{answer}"=Question(code=="{code}"&& eval(answer.contains("{answer}")))

[consequence][]Add to Programs List {id}=prog_id_list.add({id});    

rule "R0"
salience 1000

when

(age <= 0) and ((residence status = "US Citizen") || (residence status = "Lawfully-entered Alien")) and (fpl <= 200)
then

Add to Programs List "1"
end

rule "R1"
salience 1000

when

((residence status = "US Citizen") || (residence status = "Lawfully-entered Alien")) and (fpl >= 400)
then

Add to Programs List "2"
end

rule "R2"
salience 1000

when

((residence status = "US Citizen") || ((residence status = "Lawfully-entered Alien") and (residence duration >= 5))) and (fpl <= 133)
then

Add to Programs List "3"
end

rule "R3"
salience 1000

when

((residence status = "US Citizen") || (residence status = "Lawfully-entered Alien")) and (fpl > 133) and (fpl < 400)
then

Add to Programs List "4"
end
package com.quality.service;
导入com.platform.enrollment.domain.BasicInfo;
导入com.platform.enrollment.domain.FamilyMember;
global java.util.List prog_id_List;
global java.lang.Double fpl;
[条件][]和=和
[条件][]或=或
[条件][]居住状态\=“{value}”=家庭成员(basicInfo.citizenshipStatus==“{value}”)
[条件][]居住期限>\={value}=FamilyMember(basicInfo.permanentResidenceDuration>={value})
[条件][]作业状态\=“{value}”=家庭成员(basicInfo.jobStatus==“{value}”)
[条件][]大业务状态\=“{value}”=家庭成员(basicInfo.largeBusinessStatus==“{value}”)
[条件][]错误=评估(错误)
[条件][]真=评估(真)
[条件][]年龄\={value}=FamilyMember(basicInfo.getAge=={value})
[条件][]年龄<{value}=FamilyMember(basicInfo.getAge{value}=FamilyMember(basicInfo.getAge>{value})
[条件][]年龄={value})
[条件][]fpl\={value}=eval(fpl==={value})
[条件][]fpl<{value}=eval(fpl{value}=eval(fpl>{value})
[条件][]fpl={value})
[条件][]性别\=“{value}”=家庭成员(basicInfo.gender==“{value}”)
[条件][]怀孕\=真实=申请人(评估(怀孕))
[条件][]怀孕\=假=申请人(评估(!怀孕))
[条件][]家庭成员年龄大于或等于60\=true=eval(任何大于或等于60的成员)
[条件][]家庭成员年龄大于或等于60\=false=eval(!任何大于或等于60的成员)
[条件][]工作状态\=“{value}”=申请人(评估(工作状态包含(“{value}”))
[条件][]大企业状态\=“{value}”=申请人(评估(大企业状态包含(“{value}”))
[条件][]雇主福利\=“{value}”=申请人(评估(大企业状态包含(“{value}”))
[条件][]配偶\=true=eval(配偶)
[条件][]配偶\=false=eval(!配偶)
[条件][]总资产\={value}=eval(总资产=={value})
[条件][]总资产<{value}=eval(总资产{value}=eval(总资产>{value})
[条件][]总资产={value})
[条件][]代码为“{code}”的问题的答案为“{answer}”=问题(代码==“{code}”&&eval(answer.contains(“{answer}”))
[结果][]添加到程序列表{id}=prog_id_List.Add({id});
规则“R0”
显著性1000
什么时候
(年龄=5岁)和(fpl 133)和(fpl<400)
然后
添加到程序列表“4”
结束

有人能告诉我为什么是这样吗?尽管上面提供的数据使其无效,但Entering是list3。查看规则生成的java类并查看问题可能是什么也会有所帮助。 使用: -Ddrools.dump.dir= 为生成的代码设置路径


设置规则侦听器并查看事实插入更新和规则触发序列也会很有帮助

此外,您还可以尝试在没有DSL的情况下将有问题的规则分成两个规则,如下所示,以进行调试:

when
FamilyMember(basicInfo.citizenshipStatus == "US Citizen")
Fact(eval(fpl <= 133))

when
FamilyMember(basicInfo.citizenshipStatus == "Lawfully-entered Alien")
FamilyMember(basicInfo.permanentResidenceDuration >= 5)
Fact(eval(fpl <= 133))
什么时候
家庭成员(basicInfo.citizenshipStatus==“美国公民”)
事实(评估(fpl=5)

事实(eval(fpl规则3在哪里?它在您的文件中显示
规则“R2”
。事实上,规则被计算为R0、R1、R2,因此R2是规则三:)dsl文件的居住状态条目是[条件][]居住持续时间>\={value}=FamilyMember(basicInfo.permanentResidenceDuration>={value})如果我删除驻留持续时间,它将正常工作。basicInfo.permanentResidenceDuration的另一个值为null
when
FamilyMember(basicInfo.citizenshipStatus == "US Citizen")
Fact(eval(fpl <= 133))

when
FamilyMember(basicInfo.citizenshipStatus == "Lawfully-entered Alien")
FamilyMember(basicInfo.permanentResidenceDuration >= 5)
Fact(eval(fpl <= 133))